如何覆盖@SequenceGenerator(名称=“idGenerator”,sequenceName=“HIBERNATE”序列,allocationSize=50)
通常Id列如下所示,它可以很好地工作并生成序列值如何覆盖@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
@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);
}
}