如何覆盖@SequenceGenerator(name =“idGenerator”,sequenceName =“HIBERNATE_SEQUENCE”,allocationSize = 50)

时间:2015-05-12 15:08:18

标签: hibernate jpa

通常Id列如下,它完全正常并生成序列值

@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idGenerator")
@SequenceGenerator(name = "idGenerator", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 50)
@Column(name = "ID")
public Long getId()
{ return mId; }

现在我想要的是如果在程序中我设置xyz.setId(200)它应该将Id保存为200而不是由sequence生成的。现在我该如何实现?我还想使用属性sequenceName =“HIBERNATE_SEQUENCE”,allocationSize = 50。

2 个答案:

答案 0 :(得分:2)

最后,在使用了1天之后,我深入了解罐子,得到了解决方案。 我使用了@GenericGenerator(name = "idGenerator", strategy = "com.jayash.domain.UseExistingOrGenerateIdGenerator")

public class UseExistingOrGenerateIdGenerator extends SequenceHiLoGenerator {
    @Override
    public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
        Serializable id = session.getEntityPersister(null, object).getClassMetadata().getIdentifier(object, session);
        return id != null ? id : super.generate(session, object);
    }

    @Override
    public void configure(Type type, Properties params, Dialect dialect) throws MappingException {

        params.put(org.hibernate.id.SequenceGenerator.SEQUENCE, "HIBERNATE_SEQUENCE");


        params.put(SequenceHiLoGenerator.MAX_LO, String.valueOf("49"));

        super.configure(type, params, dialect);
    }

}

Yipee的工作很棒

答案 1 :(得分:0)

这是一个棘手的问题。一般而言,ID是在事务提交时生成的。这是JPA持续()没有返回数据库PK的原因之一。

我想如果有手动ID,你可以在@PostPersist监听器上更改对象的ID。如果您想在此之后使用该对象,则必须提交该更改并重新读取该对象以使其进入一致状态。

规格参考: " 3.2.4与数据库的同步:持久实体的状态在事务提交时与数据库同步。此同步涉及向持久化实体写入数据库的任何更新... 包括将新值分配给持久属性或字段...应用程序可以使用flush方法强制同步。 "