【问题标题】:How to override @SequenceGenerator(name = "idGenerator", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 50)如何覆盖@SequenceGenerator(name = "idGenerator", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 50)
【发布时间】:2015-07-23 13:28:37
【问题描述】:

通常 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 而不是由序列生成的。现在我该如何实现呢?我还想同时使用两个属性 sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 50。

【问题讨论】:

  • 为什么? ID 值应该没有意义。

标签: hibernate jpa


【解决方案1】:

这是一个棘手的问题。一般来说,ID 是在事务提交时生成的。这是 JPA 的 persist() 不返回数据库 PK 的原因之一。

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

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

【讨论】:

  • 但是在@PostPersist 中我将如何更新 Id,因为 Spring Jpa 只会通过 Id 进行搜索,然后如何在 PostPersist 中启动新事务?可以示例
【解决方案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 工作得很好

【讨论】:

    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 2011-02-20
    • 2020-05-24
    相关资源
    最近更新 更多