SequenceGenerator到SequenceStyleGenerator从hibernate 4.2移到5

时间:2017-08-11 09:16:22

标签: java hibernate jpa sequence-generators

我最近将我的项目升级为使用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的方式不正确。

0 个答案:

没有答案