检索 jpa 中自动生成的 id,给出空值



我有一个自动生成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 形式返回。