EntityManager.find 包含 2 个 id 作为主键的对象的行为
EntityManager.find behavior with an object containing 2 id as primary key
我开始步入 Java 世界,但我很难理解这一点。
我正在使用 JPA 通过 JPQL 与我的数据库进行交互。
我有一个像这样的执着 class :
@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;}
/* ... */
}
class 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;}
/* ...*/
}
所以基本上,主键由 2 个不同的 ID 组成。
现在,有时,在我的数据库中插入 CAT
之前,我检查它是否已经在 C_A_T
table 中:
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() );
没有 return null
应该的时候。
例如,当我实际上没有行 idCAT
和 idDemande
.
时,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
没有 returning null。
实际上,我只需要重新启动我的 weblogic 服务器。貌似更新数据库的时候数据源没有动态更新。
我开始步入 Java 世界,但我很难理解这一点。
我正在使用 JPA 通过 JPQL 与我的数据库进行交互。
我有一个像这样的执着 class :
@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;}
/* ... */
}
class 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;}
/* ...*/
}
所以基本上,主键由 2 个不同的 ID 组成。
现在,有时,在我的数据库中插入 CAT
之前,我检查它是否已经在 C_A_T
table 中:
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() );
没有 return null
应该的时候。
例如,当我实际上没有行 idCAT
和 idDemande
.
那么find
会不会认为只找到了catPK
匹配的一个id?
最后,我改了行:
if (null == CATinDB)
进入:
if (null == CATinDB || CATinDB.getId().getIdCAT() != inCAT.getId().getIdCAT() || CATinDB.getId().getIdDemande() != inCAT.getId().getIdDemande())
不太确定为什么当我没有与 2 id 匹配的记录时 find
没有 returning null。
实际上,我只需要重新启动我的 weblogic 服务器。貌似更新数据库的时候数据源没有动态更新。