gpt4 book ai didi

java - 返回 "behind Hibernate' s 来更新没有关联实体的外键值

转载 作者:太空宇宙 更新时间:2023-11-04 08:55:39 25 4
gpt4 key购买 nike

更新:我最终通过做相反的事情“解决”了问题!我现在将实体引用字段设置为只读(insertable=false updatable=false),并将外键字段设置为读写。这意味着我在保存新实体时需要特别小心,但在查询时,实体属性会为我解析。

<小时/>

我的域模型中有一个双向一对多关联,我使用 JPA 注释和 Hibernate 作为持久性提供程序。这几乎是您的沼泽标准父/子配置,其中一个区别是我希望将父级的外键与对父级实例的引用一起公开为子级的单独属性,如下所示:

@Entity
public class Child {
@Id @GeneratedValue
Long id;

@Column(name="parent_id", insertable=false, updatable=false)
private Long parentId;

@ManyToOne(cascade=CascadeType.ALL)
@JoinColumn(name="parent_id")
private Parent parent;

private long timestamp;
}

@Entity
public class Parent {
@Id @GeneratedValue
Long id;

@OrderBy("timestamp")
@OneToMany(mappedBy="parent", cascade=CascadeType.ALL, fetch=FetchType.LAZY)
private List<Child> children;
}

这在大多数情况下都可以正常工作,但是在很多(遗留)情况下,我想在parent_id列中放入无效值,而不必先创建一个虚假的父级。

不幸的是,由于 insertable=false, updatable=false,Hibernate 不会保存分配给 parentId 字段的值,当同一列映射到多个属性时,它需要这样做。有没有什么好的方法可以“躲在 Hibernate 背后”并将值偷偷地放入该字段,而不必下降到 JDBC 或实现拦截器?

谢谢!

最佳答案

假 parent 有什么问题吗?有一种巧妙的方法可以在一个地方完成此操作:

public void setParent(Parent parent) {
this.parent = parent;
this.parentId = parent == null ? null : parent.getId();
}

public void setParentId(Long parentId) {
final Parent parent;
if (parentId == null) {
parent = null;
} else {
parent = new Parent();
parent.setId(parentId);
}
setParent(parent);
}

关于java - 返回 "behind Hibernate' s 来更新没有关联实体的外键值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2345600/

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