2016-03-29 6 views
0

Listのオブジェクトを一括して挿入しようとしています。 IDが自動生成されるように設定されています。自動生成ID付きオブジェクトを一括挿入しようとするとNonUniqueObjectExceptionが発生する

<id name="entryId" type="integer" column="ENTRY_ID"> 
    <generator class="seqhilo"> 
     <param name="sequence">HB_ENTRY_ID_SEQ</param> 
     <param name="max_lo">50</param> 
    </generator> 
</id> 

そして、次のように私のINSERTクエリは::以前、私は次のように持っていた

try (Session session = sessionFactory.openSession()) { 
    session.beginTransaction(); 

    for (int i = 0; i < insertList.size(); i++) { 
     session.save(insertList.get(i)); 
     if (i % 100 == 0) { 
      session.flush(); 
      session.clear(); 
     } 
    } 

    session.getTransaction().commit(); 
    return insertList.size(); 
} 

は、私は同様に設定し、正しいbatch_sizeプロパティ値を持っています。上記の罰金働いた、しかし、最近私は、アノテーションをベースとすることが私のコードを変更し、私は以下の持っている:私は今、これを実行すると

@Id 
@Column(name = "ENTRY_ID") 
@GeneratedValue(generator = "hibSeq", strategy = GenerationType.SEQUENCE) 
@SequenceGenerator(name = "hibSeq", sequenceName = "HB_ENTRY_ID_SEQ", allocationSize = 100) 

は、インサートが、私がしようとしてきたorg.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session

をスローしますこのエラーをhereおよびhereとして理解していますが、問題を解決できませんでした。私が知る限りでは、シーケンスジェネレータがすでに使用されているIDをリサイクルさせる何かがsession.flush()/clear()ステージで起こっています。

私は間違っていますか?

答えて

0

XMLで提供されるジェネレータは、アノテーションで指定されたジェネレータと同じではありません。前者はシーケンスhiloであり、これはシーケンスから返された値に基づいてIDプレフィックスを生成します。

後者はシーケンスの値をとります:それはその値と次の100をメモリに保持します(allocationSize)ので、100回の呼び出しを避けることができます。 100個のIDが生成された後しかし、それはNEXTVAL呼び出し、2番目のエントリとして同じIDが生成されます。ここで

Generated ID 0 (query) .NEXTVAL 
Generated ID 1 (in memory) 
Generated ID 2 (in memory) 
... 
Generated ID 100 (in memory) 
Generated ID 1 (query) .NEXTVAL 

ソリューションはALTER SEQUENCE HB_ENTRY_ID_SEQ INCREMENT BY 100

にあります
関連する問題