我有一个自动生成id的患者实体类:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "personId", nullable = false, unique = true)
private Long personId;
public void copy (Patients patient) {
if (patient.getNationality() != null)
this.setNationality(patient.getNationality());
if (patient.getGivenName() != null)
this.setGivenName(patient.getGivenName());
if (patient.getMiddleName() != null)
this.setMiddleName(patient.getMiddleName());
if (patient.getPrefix() != null)
this.setPrefix(patient.getPrefix());
}
/**
* @return PERSONID
*/
public int getPersonId() {
return personId;
}
我的addPerson in PersonDaoImpl :
public Patients addPerson(Patients person) {
Patients p = new Patients(person);
try {
em = factory.createEntityManager();
em.getTransaction().begin();
SimpleDateFormat sdfr = new SimpleDateFormat("yyyy-MM-
dd'T'HH:mm:ss.SSS+05:30");
Date date = new Date();
String dateCreated = sdfr.format(date);
p.setDateCreated(dateCreated);
em.persist(p);
em.getTransaction().commit();
} catch (Exception e) {
em.getTransaction().rollback();
log.error("Exception caught :: " + e);
p = null;
}
em.close();
return p;
}
我的更新 api 亲自服务类:
@PUT
@Path("/person-manager-resource/updatePersonById")
@Produces("application/json")
@Consumes("application/json")
public Response update(Patients person) {
log.info("Inside UpdatePerson");
log.info(person.getPersonId());
dao = new PersonDaoImpl();
ObjectMapper mapper = new ObjectMapper();
person1 = dao.updatePerson(person);
String result = "";
try {
result = mapper.writeValueAsString(person1);
log.info("Person updated :: " + result);
} catch (JsonProcessingException e) {
log.info("Exception Caught :: " + e);
}
if (person1 != null) {
return Response.
status(Response.Status.OK.getStatusCode()).
entity(result).
build();
} else {
return Response.
status(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode()).
entity(result).
build();
}
}
更新人员:
public Patients updatePerson(Patients updatedPatient) {
Patients dbPatient = new Patients();
TypedQuery<Patients> query = null;
ObjectMapper mapper = new ObjectMapper();
try {
em = factory.createEntityManager();
String identifier = updatedPatient.getPersonIdentifiers().getIdentifier();
String queryStr = "SELECT c FROM Patients c where c.personIdentifiers.identifier = '" + identifier + "'";
query = em.createQuery(queryStr, Patients.class);
dbPatient = query.getSingleResult();
dbPatient.copy(updatedPatient);
em.getTransaction().begin();
em.merge(dbPatient);
em.getTransaction().commit();
} catch (Exception e) {
log.error("Exception caught :: " + e);
em.getTransaction().rollback();
dbPatient = null;
}
em.close();
return dbPatient;
}
我通过我的 REST API 传递一个 json 对象来创建患者条目:
{
"personId": 5,
"prefix": null,
"givenName": "Pooja roy",
"middleName": null
}
现在一切顺利。我将相同的对象(现在包含自动生成的 personId)放在应该更新对象的 api 中。我在患者实体对象中传递 json。当我打印整个对象时,personId 为空。
由于它是空键和主键,因此我无法进行合并。我必须手动更新数据库对象,这是一个非常漫长的过程。
知道为什么它显示为空以及如何检索它吗?
我正在使用邮政。
我认为整个问题是由updatePerson
方法的实现引起的。您应该按如下方式实现该方法,它应该按预期工作,假设updatedPatient
实例是一个持久实体(意味着它设置了一个 ID 字段):
public Patients updatePerson(Patients updatedPatient) {
Patients mergedPatient = new Patients();
try {
em = factory.createEntityManager();
em.getTransaction().begin();
mergedPatient = em.merge(updatedPatient);
em.getTransaction().commit();
} catch (Exception e) {
log.error("Exception caught :: " + e);
em.getTransaction().rollback();
}
em.close();
return mergedPatient;
}
现在mergedPatient
应该包含同步状态。
更新:
替代解决方案
无论出于何种原因,您都不能对 ID 字段使用资源库。然后,以下方法可能会解决您的问题:
public Patients updatePerson(Patients updatedPatient) {
Patients dbPatient = new Patients();
try {
em = factory.createEntityManager();
String identifier = updatedPatient.getPersonIdentifiers().getIdentifier();
em.getTransaction().begin();
dbPatient = em.find(Patients.class, Long.parseLong(identifier));
dbPatient.copy(updatedPatient);
em.getTransaction().commit();
} catch (Exception e) {
// ..:
dbPatient = null;
}
em.close();
return dbPatient;
}
由于 em.find()
方法在事务内部执行,因此将管理返回的对象,这意味着在事务提交时,对该返回实例的任何更改都将与数据库同步。
PersonId 是自动生成的 ID。所以,jpa 不允许我为 personID 设置一个二传手。我们在实体类中只有 getPersonId() 方法。
因此,在updatePerson(患者)中,当我传递person对象时,每个setter都会被调用,从而创建该对象。由于 personId 没有 setter 方法,因此在该对象中以 null 形式返回。