我正在使用Hibernate 3.5.6-Final進行生產的Oracle數據庫和集成測試的H2數據庫。 Hibernate映射的ID創建看起來像這樣延伸EasyPersistentObject每一個實體:如何重置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;
每個JUnit的集成測試我與
new SchemaExport(configuration).create(false, true);
一切刪除數據庫中的所有數據前,直到我增加了工作正常用於序列生成的分配大小。舉例來說,當插入測試數據時,10將會破壞與UniqueKeyConstraintViolations的多項測試。
例如:
- 測試1:創建8個測試對象(Hibernate有ID值9,10仍然分配)
- 重新創建數據庫
- 的Test2:創建12個測試對象(Hibernate使用圖9和10對於ID,然後從數據庫序列中加載新的ID,同時重置(1-10),嘗試插入第二個ID爲9的實體時失敗)
所以我的問題:有沒有一種方法可以在每次測試之前重置Hibernates分配的ID以及?
增加: 我不使用的PersistenceManager從JPA但純粹的SessionFactory這是這樣創建的:
@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;
}
我真的需要重新加載我的整個Spring上下文來獲取Hibernate的標識生成器reseted?
感謝這個詳細的答案,這證實了我不想相信的東西。我將用int單個布爾值重置值,並用你的黑客解決它。太悲傷了,沒有乾淨的方法來做到這一點... – GreenTurtle