Hibernate:两个属性中生成的值相同

时间:2010-05-05 13:29:13

标签: java hibernate jpa orm

我想要生成第一个:

@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,那就更好了。

2 个答案:

答案 0 :(得分:3)

选择你的毒药:

选项#1

您可以将bId注释为org.hibernate.annotations.Generated并在插入时使用数据库触发器(我假设已将nextval分配给AID,因此我们将分配{{1到BID):

curval

我并不是触发器和幕后发生的事情的忠实粉丝,但这似乎是最简单的选择(尽管不是最好的选择)。

选项#2

创建一个新实体,持久保存,刷新实体管理器以获取指定的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

丑陋,但确实有效。

选项#3

使用回调注释设置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)。

选项#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值?