我想要生成第一个:
@Id
@Column(name = "PRODUCT_ID", unique = true, nullable = false, precision = 12,
scale = 0)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PROD_GEN")
@BusinessKey
public Long getAId() {
return this.aId;
}
我希望bId最初与aId完全一样。一种方法是插入实体,然后获取由DB生成的aId(第二个查询),然后更新实体,将bId设置为等于aId(第三个查询)。有没有办法让bId获得与aId相同的生成值?
请注意,之后,我希望能够从我的gui更新bId。
如果解决方案是JPA,那就更好了。
答案 0 :(得分:3)
选择你的毒药:
您可以将bId
注释为org.hibernate.annotations.Generated
并在插入时使用数据库触发器(我假设已将nextval
分配给AID,因此我们将分配{{1到BID):
curval
我并不是触发器和幕后发生的事情的忠实粉丝,但这似乎是最简单的选择(尽管不是最好的选择)。
创建一个新实体,持久保存,刷新实体管理器以获取指定的ID,在CREATE OR REPLACE TRIGGER "MY_TRIGGER"
before insert on "MYENTITY"
for each row
begin
select "MYENTITY_SEQ".curval into :NEW.BID from dual;
end;
上设置aId
,合并实体。
bId
丑陋,但确实有效。
使用回调注释设置em.getTransaction().begin();
MyEntity e = new MyEntity();
...
em.persist(e);
em.flush();
e.setBId(e.getAId());
em.merge(e);
...
em.getTransaction().commit();
内存中(直到将其写入数据库):
bId
如果您不需要在插入时写入id,这应该有效(但在这种情况下,请参阅选项#4)。
您实际上可以在@PostPersist
@PostLoad
public void initialiazeBId() {
if (this.bId == null) {
this.bId = aId;
}
}
的getter中添加一些逻辑,而不是使用回调:
bId
同样,如果你不需要在插入数据库中持久保存id,这将有效。
答案 1 :(得分:0)
如果你使用JPA,在插入新的A后,id应该设置为生成的值,我应该(可能它取决于你使用的是哪个jpa提供者),因此不需要第二个查询。然后在你的DAO中将bld设置为ald值?