2016-09-15 3 views
0

私は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;} 
    /* ... */ 
} 

クラスCATPKCATのインスタンスの主キーを表します

@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には、実際に右の行がない場合、idCATidDemandeの行を含めることができます。

だから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) 

を。

+0

ここでJPAプロバイダのログを見て、SQLが呼び出されたことを確認します。 –

+0

どうすればいいですか?私はintelliJを使用しています。 persistence.xmlファイルがありますが、そこからどこに行くのかわかりません – Ellone

+0

persistence.xmlは通常、JPAプロバイダを指定します。それが可能かどうかにかかわらず、あなたはCLASSPATHと "emf"のインスタンスのクラスからどちらを使用しているのかを簡単に調べることができます。だからあなたはそのプロバイダのドキュメントを見て、次にログを調べます。別名「デバッグ」 –

答えて

0

実際、私はweblogicサーバーを再起動する必要がありました。データベースを更新するとデータソースが動的に更新されないようです。

関連する問題