使用包含2个id作为主键的对象的EntityManager.find行为

时间:2016-09-15 12:08:14

标签: java database jpa persistence jpql

我开始步入Java世界,我很难理解这一点。

我使用JPA与JPQL进行数据库交互。

我有一个像这样的持久类:

@Entity
@Table(name="C_A_T")
@NamedQuery(name="CAT.findAll", query="SELECT c FROM CAT c")
public class CAT implements Serializable {
    private static final long serialVersionUID = 1L;
    @EmbeddedId
    private CATPK id;
    private String offer;
    @Temporal(TemporalType.DATE)
    @Column(name="MODIF_DATE")
    private Date modifDate;


    public CAT() {}
    public CATPK getId() {return id;}
    public void setId(CATPK id) {this.id = id;}
    public String getOffer() {return offer;}
    public void setOffer(String offer) {this.offer = offer;} 
    public Date getModifDate() {return modifDate;}
    public void setModifDate(Date modifDate) {this.modifDate= modifDate;}
    /* ... */
}

CATPK表示CAT实例的主键:

@Embeddable
public class CATPKimplements Serializable {
    //default serial version id, required for serializable classes.
    private static final long serialVersionUID = 1L;
    @Column(name="ID_CAT")
    private String idCAT;
    @Column(name="ID_DEMANDE")
    private String idDemande;

    public CATPK() {}
    public String getIdCAT() {return this.idCAT;}
    public void setIdCAT(String idCAT) {this.idCat= idCat;}
    public String getIdDemande() {return this.idDemande;}
    public void setIdDemande(String idDemande) {this.idDemande = idDemande;}
    /* ...*/
}

基本上,primay键由2个不同的ID组成。

现在,有时候,在我的数据库中插入CAT之前,我检查了它是否已经在C_A_T表中:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("cie");
em = emf.createEntityManager();
em.getTransaction().begin();
// inCAT is an instance of CAT on which there is a complete primary key CATPK (made of 2 id)
CAT CATinDB = em.find( CAT.class, inCAT.getId() );
if (null == CATinDB)
  em.persist(inCAT); // CAT created
em.getTransaction().commit();
em.close();

现在问题是,em.find( CAT.class, inCAT.getId() );行不应该返回null

例如,当我实际上没有右侧idCATidDemande的行时,CATinDB可以包含一行。

那么find会认为它只有一个catPK匹配的ID吗?

最后,我更改了一行:

if (null == CATinDB)

进入:

if (null == CATinDB || CATinDB.getId().getIdCAT() != inCAT.getId().getIdCAT() || CATinDB.getId().getIdDemande() != inCAT.getId().getIdDemande())

当我没有与2个ID匹配的记录时,不确定为什么find没有返回null。

1 个答案:

答案 0 :(得分:0)

实际上,我只需要重启我的weblogic服务器。我更新数据库时看起来数据源没有动态更新。