我最近升级了我的项目以使用之前使用休眠 4.2 的休眠 5。我们有数据库序列,其命名约定为“SEQ_PrimaryKeyName”。在休眠 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);
}
}
SequenceGenerator 在 hibernate 5 中已被弃用,根据 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 的方式不正确。