私はJavaの世界に足を踏み入れ始めており、これを理解するのに苦労しています。主キーとして2 idを含むオブジェクトを持つEntityManager.findの動作
JPQLを使用して自分のデータベースとやりとりするためにJPAを使用しています。
私はこのような永続クラスがあります。
@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;}
/* ...*/
}
のでbasicly、primayキーが2で作られて異なるID。それはC_A_T
テーブルにない場合
は今、時々、私のデータベースにCAT
を挿入する前に私がチェック:
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
を返さないということですすべきだ。
たとえば、CATinDBには、実際に右の行がない場合、idCAT
とidDemande
の行を含めることができます。
だからfind
は、catPK
のIDが1つしか見つからないと考えていますか?
最後に、私はライン変更:私は2のIDに一致するレコードを持っていないときfind
がnullを返していなかった理由は本当にわからない
if (null == CATinDB || CATinDB.getId().getIdCAT() != inCAT.getId().getIdCAT() || CATinDB.getId().getIdDemande() != inCAT.getId().getIdDemande())
:へ
if (null == CATinDB)
を。
ここでJPAプロバイダのログを見て、SQLが呼び出されたことを確認します。 –
どうすればいいですか?私はintelliJを使用しています。 persistence.xmlファイルがありますが、そこからどこに行くのかわかりません – Ellone
persistence.xmlは通常、JPAプロバイダを指定します。それが可能かどうかにかかわらず、あなたはCLASSPATHと "emf"のインスタンスのクラスからどちらを使用しているのかを簡単に調べることができます。だからあなたはそのプロバイダのドキュメントを見て、次にログを調べます。別名「デバッグ」 –