1

我最近升级了我的项目以使用之前使用休眠 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 的方式不正确。

4

0 回答 0