私は、実稼働用のOracleデータベースと統合テスト用のH2データベースとでHibernate 3.5.6-Finalを使用しています。 ID作成のためのHibernateのマッピングがEasyPersistentObjectを拡張するすべてのエンティティと以下のようになります。私は、データベースからすべてのデータを削除していますそれぞれのJUnit統合テストの前にHibernateシーケンスジェネレータをリセットするには?
@MappedSuperclass
public class EasyPersistentObject implements Serializable {
@Id
@SequenceGenerator(name = "hibernate_seq", sequenceName = "hibernate_id_seq", allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hibernate_seq")
protected Integer id;
私はインクリメントまで、すべてが正常に動作します
new SchemaExport(configuration).create(false, true);
で配列生成のためのallocationSize。これを例えばに上げる。 10は、テストデータを挿入するときに、UniqueKeyConstraintViolationsでいくつかのテストを中断します。例えば
:
- のTest1:8つのテストオブジェクト(Hibernateはまだ割り当てられたID値9および10を有している)
- 再作成データベース
- Test2を作成:12個のテストオブジェクトを作成(Hibernateが9と10を使用しIDについては、一方(1-10)resetedとID 9と第二のエンティティを挿入しようとすると失敗したデータベース配列から新しいIDをロードする)
だから私の質問:各テストの前にHibernateが割り当てたIDをリセットする方法はありますか?
追加:このように作成された私はJPAはなく、純粋にHibernateのSessionFactoryからのPersistenceManagerを使用していない :
@Bean(name = "easySF")
public SessionFactory easySessionFactory(@Qualifier("easyConfig") AnnotationConfiguration configuration) {
configuration.setInterceptor(new HibernateInterceptor());
return configuration.buildSessionFactory();
}
@Bean(name = "easyConfig")
protected AnnotationConfiguration easyHibernateConfiguration() {
AnnotationConfiguration configuration = new AnnotationConfiguration();
configuration.setProperties(createHibernateProperties());
configuration.addResource("NamedQueries.hbm.xml");
for (Class annotatedClass : getAnnotatedClasses()) {
configuration.addAnnotatedClass(annotatedClass);
}
configuration.setListener("post-load", new PreloadEventListener());
return configuration;
}
私は本当にHibernateのIDジェネレータを取得するために私の全体のSpringコンテキストをリロードする必要がありますかリセットされましたか?これは、そのIDジェネレータリロードする休止状態を強制する
私が信じたくないことを確認するこの詳細な回答をありがとう。私は両方のint属性を単一のブール値をリセットし、あなたのハックで解決してください。あまりにも悲しいことに、これを行うためのクリーンな方法はありません... – GreenTurtle