gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:53:39 25 4
gpt4 key购买 nike

我想生成第一个:

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

最佳答案

选择你的毒药:
选项1
你可以批注bIdorg.hibernate.annotations.Generated并在插入时使用数据库触发器(我假设 nextval 已分配给 AID,因此我们将 curval 分配给 BID):

CREATE OR REPLACE TRIGGER  "MY_TRIGGER"
before insert on "MYENTITY"
for each row
begin
select "MYENTITY_SEQ".curval into :NEW.BID from dual;
end;
我不是触发器和幕后发生的事情的忠实粉丝,但这似乎是最简单的选择(虽然不是便携性的最佳选择)。
选项#2
创建一个新实体,持久化它,刷新实体管理器以获取分配的 id,设置 aIdbId ,合并实体。
em.getTransaction().begin();
MyEntity e = new MyEntity();
...
em.persist(e);
em.flush();
e.setBId(e.getAId());
em.merge(e);
...
em.getTransaction().commit();
丑陋,但它的工作原理。
选项#3
使用回调注解设置 bId 内存中 (直到它被写入数据库):
@PostPersist
@PostLoad
public void initialiazeBId() {
if (this.bId == null) {
this.bId = aId;
}
}
如果您不需要在插入时写入 id(但在这种情况下,请参阅选项 #4),这应该可以工作。
选项#4
您实际上可以在 bId 的 getter 中添加一些逻辑而不是使用回调:
public Long getBId() {
if (this.bId == null) {
return this.aId;
}
return this.bId;
}
同样,如果您不需要在插入时将 id 持久化到数据库中,这将起作用。

关于java - Hibernate:在两个属性中生成相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2773595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com