通常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。
答案 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方法强制同步。 "