我有双向,一对多,多对一的关系。比如说,一家公司有很多人,一个人有一家公司,所以,在公司里,
@OneToMany(mappedBy = "company", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Collection<Person> persons;
并且在人物中,
@ManyToOne
@JoinColumn(name="COMPANY_ID")
private Company company;
现在,假设我在公司有一个@PrePersist / @PreUpdate方法,当它更新时,我想在所有人身上设置相同的时间戳......比如,
@PrePersist
@PreUpdate
public void setLastModified() {
this.lastModified = System.currentTimeMillis();
if (persons != null) {
for (Person person : persons) {
person.setLastModified(this.lastModified);
}
}
}
当我调试这个时,我看到公司中的人员字段总是空的。当我查看人物集合的类型时,它是一个java.util.Vector。不确定这是否相关。我希望看到一些自动加载JPA集合类型。
我做错了什么?
答案 0 :(得分:2)
您必须设置双方的关系。当您创建新人员并设置其公司时,您还必须将人员添加到公司的人员(员工?)。
另外,你不应该在一个对象的prePersist / Update中更改另一个对象,你应该使用它自己的prePersist / Update事件。
答案 1 :(得分:1)
将fetch = FetchType.Eager添加到@ManyToOne注释。你把它添加到关系的另一边。
答案 2 :(得分:0)
如果您希望在personList
中获得Company
,请使用FetchType.EAGER
。
在JPA中,
@--ToOne => Default : FetchType.EAGER
@--ToMany => Default : FetchType.LAZY
@JoinColumn(name="COMPANY_ID", fetch = FetchType.EAGER)
private Company company;
答案 3 :(得分:0)
在我的情况下,我意识到不需要使用(双向)OneToMany-ManyToOne关系来解决此问题。
例如,在单向OneToMany关系中,只需编写如下内容:
// Company Class:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<Person> persons = new HashSet<Person>();
// Person Class:
// - Remove the 3 lines
如果这不能解决您的问题,请检查您在“个人”或“公司”课程中是否使用了“ 龙目岛” 。
如果是这种情况,请在Company类中添加这两个注释(对于Person类,则反之亦然):
@Data
@Entity
@EqualsAndHashCode(exclude = { "persons"}) // This,
@ToString(exclude = { "persons"}) // and this
public class Company implements Serializable {
// ...
private Set<Person> persons = ...
/ ...
答案 4 :(得分:0)
这是由Hibernate中的一个已知错误引起的,请参见https://hibernate.atlassian.net/browse/HHH-9979。
不幸的是,我不知道有任何解决方法。