我最近将我的项目升级为使用hibernate 5,之前使用的是hibernate 4.2。我们有数据库序列,命名约定遵循" SEQ_PrimaryKeyName"。在hibernate 4.2中我们使用org.hibernate.id.SequenceGenerator来生成序列 - 代码看起来像这样 -
public class PrimaryKeyGenerator extends IdentityGenerator implements Configurable {
private PrimaryKeyGenerator pkGen;
public PrimaryKeyGenerator () {
pkGen= new SequenceGenerator();
}
//configure sequence generator
public void configure(Type type, Properties params, Dialect Dialect) throws MappingException {
if (pkGen instanceof Configurable) {
String seqName = "SEQ_" + params.getProperty(PersistentIdentifierGenerator.PK);
params.setProperty(SequenceGenerator.SEQUENCE, seqName);
((Configurable)pkGen).configure(type, params, dialect);
}
}
// Generate sequence
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
return pkGen.generate(session, obj);
}
}
在Hibernate 5中不推荐使用SequenceGenerator,根据javadoc,建议使用org.hibernate.id.enhanced.SequenceStyleGenerator。
我将现有的PrimaryKeyGenerator类修改为以下
public class PrimaryKeyGenerator extends IdentityGenerator implements Configurable {
private PrimaryKeyGenerator pkGen;
public PrimaryKeyGenerator() {
pkGen = new SequenceStyleGenerator();
}
// implement the methods of SequenceStyleGenerator.java
@Override
public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException {
if (pkGen instanceof Configurable) {
String seqName = "SEQ_" + params.getProperty(PersistentIdentifierGenerator.PK);
params.setProperty(SequenceStyleGenerator.SEQUENCE_PARAM, seqName);
((Configurable) pkGen).configure(type, params, serviceRegistry);
}
}
public Serializable generate(SessionImplementor session, Object obj) throws HibernateException {
// collect instance of org.hibernate.boot.model.relational.Database
Database db = MetadataExtractor.INSTANCE.getDatabase();
(SequenceStyleGenerator)pkGen).registerExportables(db);
return pkGen.generate(session, obj);
}
}
通过以上更改顺序正在生成。我遇到的一个问题是,在调用generate方法之前调用registerExportable()方法是否可以?我不确定但看起来registerExportable应该只被调用一次而不是每次调用generate()方法。如果我没有明确地调用registerExportable方法,我会得到以下异常。
"SequenceStyleGenerator
的SequenceStructure未正确初始化"
可能是我尝试使用SequenceStyleGenerator的方式不正确。