2012-05-07 8 views
0

テーブル間にOneToMany接続があります結果およびResultAuxResultAuxオブジェクトをの結果から取得できます。その後、ResultAuxオブジェクトを追加して、mergeを設定して、データベースに変更をフラッシュします。このように:私は知っている必要がありますいくつかの追加措置についてはHibernate:新規または古いレコード

Set<ResultAux> resultAuxes = result.getResultAuxes(); 
if (resultAuxes != null) { 
    for (ResultAux resultAux : resultAuxes) { 
     resultAux = getDaoFactory().getResultAuxDAO().merge(resultAux); 
    } 
} 

エントリに新しいレコードを設定して、テーブルに挿入されるか、それが更新され、古いものと、(変更されたりしない)です。私はのすべてのエントリResultAuxがすでにIDを持っていることに気付いたので、私はnullのためにそれをチェックすることができませんでした。そのようなものを決める方法はありますか(特に余分なライブラリは必要ありません)?

EDIT:私は私の答えはあなたの問題を解決しますが、@EugenioCuevasコメントに戻ってくることはよく分からない

<hibernate-mapping> 
    <class name="ResultAux" table="RESULT_AUX"> 
     <id name="id" column="ID"> 
      <generator class="native" /> 
     </id> 

     <property name="additinalInfoType" column="AITYPE" type="dao.hibernate.utl.AdditinalInfoEnumType" /> 
     <property name="sorter" column="SORTER" /> 
     <property name="value1" column="VAL1" /> 
     <property name="value2" column="VAL2" /> 

     <many-to-one name="result" column="RESULT_ID" class="Result" /> 
    </class> 
</hibernate-mapping> 

<hibernate-mapping> 
    <class name="Result" table="RESULT"> 
     <id name="id" column="ID"> 
      <generator class="native" /> 
     </id> 

     <property name="questionNumber" column="Q_NUM" /> 
     <property name="answerNumber" column="A_NUM" /> 
     <property name="questionGroup" column="Q_GRP" /> 
     <property name="answerValue" column="A_VAL" /> 
     <set name="resultAuxes" inverse="true" cascade="all-delete-orphan" 
      lazy="false"> 
      <key column="RESULT_ID" /> 
      <one-to-many class="ResultAux" /> 
     </set> 
    </class> 
</hibernate-mapping> 
+0

非永続エンティティにはIDが設定されていないと言います。あなたはセットのすべてのエントリがIDを持っていると確信していますか? – sp00m

+1

私はresultAuxでマージを使うべきではないと思っていますが、結果クラスでは、hibernateは1対多リレーションを処理する必要があります。マッピング設定も投稿できますか? –

+0

@ sp00m:Hibernateは私の強い側ではありません。 Resultオブジェクトから取得したResultAuxセットにエントリを追加するときに何が起こるかについていくつかの疑問があります。また、Resultのセットは与えられたコードの上に永続化されます。おそらく、このコード実行の時点でResultAuxが永続的になるのはカスケードしているのかもしれません。 –

答えて

0

は、Hibernateは、基礎となるDBの能力に依存しidentitysequence又はhilo PK生成戦略として選択させます。

Set<ResultAux> resultAuxes = result.getResultAuxes(); 
ResultAux newResultAux = new ResultAux(); 

/** 
* As session.save() requires to return the ID for the saved instance , if "sequence" strategy is 
* used , Hibernate will hit the DB to select the next ID (eg. select some_seq.NEXTVAL) to be used 
* for the saved instance. So newResultAux will have an ID after save() but actually it is not saved to 
* the DB yet as saving to the DB occurs during session.flush() 
*/ 
session.save(newResultAux); 
resultAuxes.add(newResultAux); 

は、私はあなたが以下のコードによって(割り当てられたIDを持つことができDBに挿入されていないレコード)を、この問題が発生することができるように選択し、「シーケンス」戦略を休止、あなたのDBのためだと思いますその解決策の1つは、@VersionプロパティをResultAuxに追加することです。次に、新しいレコードの@VersionプロパティがNULLである必要があるため、この@Versionプロパティの値をチェックして、新しいレコードかどうかを確認できます。

+0

実際には...私は、ハイバネートでSQLロギングを有効にしました。また、新しいレコード用に生成されたSQLステートメントは、IDがnullの挿入です。したがって、問題のコードの前に挿入が行われている必要があります。どう思いますか? –

+0

ヌルIDを持つINSERT SQLが発行されている場合、これらのレコードはすでに挿入されていますが、もちろんIDがあります。実際に何を決定しますか?挿入されたばかりのレコードを特定するか、またはテーブルに挿入されるレコードを決定しますか? –

+0

ResultAux-esを永続化するコードをコメントアウトしようとしました。それはそれにかかわらず動作します。だから私は正しかった、それはカスケードしている。私がsp00mに言ったように、Hibernateは私の強い側ではありません。問題は解消されています。ありがとう! –

0

、私はあなたの子エンティティを永続化するために、このような何かをやっているだろう:

Set<ResultAux> resultAuxes = result.getResultAuxes(); 
if (resultAuxes != null) { 
    for (ResultAux resultAux : resultAuxes) { 
     resultAux.setResult(result); 
    } 
} 
getDaoFactory().getResultDAO().merge(result); 

Hibernateはリレーションを独自に管理する必要があります。主キー生成戦略としてnativeを使用

関連する問題