2016-09-14 5 views
1

私はHibernate JPAを初めて使用しています.....親テーブルと複数の子テーブルがあります。親テーブル存在に基づく子テーブルにレコードを挿入したい親テーブルにレコードを挿入する必要はありません。親テーブルにエントリがある場合、子テーブルに挿入します。私は挿入可能で、親テーブルの主キーに偽として更新可能です。それは動作していません。私はJPA 2.0のバージョンを使用しています。事前に感謝します。その他の情報をお知らせください。Hibernate JPA 2.0のみの更新と子テーブルへの挿入

================コメントからコピー&ペースト:

コードサンプル:

@Entity 
@NamedQuery(name="Custome.findAll", query="SELECT p FROM Customer p") 
public class Customer extends AbstractObject implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @EmbeddedId 
    private CustomerPK pk; 

@Temporal(TemporalType.DATE) 
@Column(name="end_dt") 
private Date endDt; 

@Column(name="desc_txt") 
private String descTxt; 

//bi-directional many-to-one association to Dependent 
@OneToMany(mappedBy="customer", cascade=CascadeType.ALL) 
private List<Dependent> dependents = new ArrayList<>(); 
} 

私は顧客テーブルおよびWANにdescTxtを更新したいです従属テーブルを挿入します。 CustomerPKがテーブルに存在する場合、私は更新したいと思っていません。私はCustomerテーブルのレコードの更新と挿入もスキップします。私は現在session.saveorUpdate(オブジェクト)を使用していますレコードが存在する場合、それは親レコードを更新して子テーブルに挿入しますが、親レコードが存在しない場合、親レコードと子レコードを挿入しています。レコード

+0

何をしようとしているのかを示すコードを追加してください。親と子のエンティティは何ですか?それらはどのように関係していますか? – greyfairer

+0

コードサンプル:@Entity @NamedQuery(名= "Custome.findAll"、クエリ= "顧客PからPを選択") publi} Cクラス顧客はAbstractObjectは= 1Lシリアライズ{ \tプライベート静的最終長いserialVersionUIDのを実装して延び。 \t @EmbeddedId \tプライベートCustomerPK pk; \t @Temporal(TemporalType.DATE) \t @Column(name = "end_dt") \tプライベートDate endDt; \t @Column(name = "desc_txt") \tプライベートString descTxt; 依存 へ\t //双方向多対一の関連\t @OneToMany(mappedBy = "顧客"、カスケード= CascadeType.ALL) \t民間一覧扶養=新しいArrayListを<>(); –

+0

顧客表のdescTxtを更新し、従属表を挿入するwanを更新したいとします。 CustomerPKがテーブルに存在する場合、私は更新しません。 Customerテーブルのレコードの更新と挿入もスキップします。 現在、私はsession.saveorUpdate(オブジェクト)を使用しています レコードが存在する場合は親レコードを更新して子テーブルに挿入します 親レコードが存在しない場合は親レコードと子レコードを挿入します親レコードに挿入 –

答えて

0

JPAはこれを修正しません。 'saveOrUpdate'を呼び出すと、保存または更新されます。あなたが期待しているように行動する場所は非常に悪いです。

実際には、保存しない場合は、新しいCustomerオブジェクトを作成しないでください。 JPA以外のコードでチェックを行うのが最適です(例:

Customer customer = entityManager.find(Customer.class, customerPK); 
if(customer != null){ 
    customer.setDescription(...) 
    customer.addDependent(new Dependent (...)) 
    //customer + dependents will be saved at end of transaction or at flush 
} 
else { 
    LOG.info("Ignoring unexisting id", customerPk) 
} 

注:

  • あり、顧客のインスタンスは、Hibernateが作成された場合session.saveOrUpdateを呼び出す必要はないのです、あなたは適切なトランザクション/セッションMGMTを行います。 Hibernateは、現在のセッション内の永続オブジェクトに対するすべての変更を追跡し、セッションの終了時にそれらをフラッシュします。
  • 顧客の扶養者リストに依存者を追加すると(ベストプラクティスはaddXxxメソッドを使用することです)、セッションの最後に正しい外部キーが自動的に挿入されます。
+0

更新していただきありがとうございます。このオプションをお知らせします。 –

+0

更新していただきありがとうございます。試してみてください...私が探しているもう1つの説明は、customer.addDependent(...)をCustomerに追加する必要がありますか?それ以外の場合は、Customerエンティティの存在を確認した後でsession.saveorupdateを使用できますか? –

+0

追加されたメモを見る – greyfairer

関連する問題