Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何覆盖@SequenceGenerator(名称=“idGenerator”,sequenceName=“HIBERNATE”序列,allocationSize=50)_Hibernate_Jpa - Fatal编程技术网

如何覆盖@SequenceGenerator(名称=“idGenerator”,sequenceName=“HIBERNATE”序列,allocationSize=50)

如何覆盖@SequenceGenerator(名称=“idGenerator”,sequenceName=“HIBERNATE”序列,allocationSize=50),hibernate,jpa,Hibernate,Jpa,通常Id列如下所示,它可以很好地工作并生成序列值 @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "idGenerator") @SequenceGenerator(name = "idGenerator", sequenceName = "HIBERNATE_SEQUENCE", allocationSize = 50) @Column(name = "ID") public Long getId() {

通常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,而不是由序列生成的Id。现在我该如何实现这一点呢?我还想使用sequenceName=“HIBERNATE\u SEQUENCE”这两个属性,allocationSize=50。

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

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

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

最后,在利用了一天的时间后,我深入到罐子中,找到了解决方案。 我使用了
@GenericGenerator(name=“idGenerator”,strategy=“com.jayash.domain.UseExistingOrGenerateIdGenerator”)


哎呀,它工作得很好

为什么?ID值应该没有任何意义。但是在@PostPersist中,我将如何更新ID,因为Spring Jpa将仅通过ID进行搜索,然后如何在PostPersist中启动新事务?可以举例说明吗
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);
    }

}