JPA OneToMany,总是空的
我有一种双向、一对多和多对一的关系。比如说,一个公司有很多人,一个人有一个公司,所以,在公司里JPA OneToMany,总是空的,jpa,one-to-many,Jpa,One To Many,我有一种双向、一对多和多对一的关系。比如说,一个公司有很多人,一个人有一个公司,所以,在公司里 @OneToMany(mappedBy = "company", fetch = FetchType.EAGER, cascade = CascadeType.ALL) private Collection<Person> persons; 现在,假设我在Company上有一个@PrePersist/@PreUpdate方法,当它被更新时,我想在所有人身上设置相同的时间戳。。。像 @Pr
@OneToMany(mappedBy = "company", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Collection<Person> persons;
现在,假设我在Company上有一个@PrePersist/@PreUpdate方法,当它被更新时,我想在所有人身上设置相同的时间戳。。。像
@PrePersist
@PreUpdate
public void setLastModified() {
this.lastModified = System.currentTimeMillis();
if (persons != null) {
for (Person person : persons) {
person.setLastModified(this.lastModified);
}
}
}
调试时,我看到公司中的persons字段总是空的。当我查看persons集合的类型时,它是一个java.util.Vector。不确定这是否相关。我希望看到一些自动加载JPA集合类型
我做错了什么?添加fetch=FetchType。渴望@manytone注释。您已将其添加到关系的另一端。如果您希望在
公司中获得个人列表
,请使用FetchType.EAGER
。
在JPA中
你们必须确定你们关系的双方。创建新人员并设置其公司时,还必须将该人员添加到公司的人员(员工?)中
另外,您不应该在一个对象的prePersist/Update中更改另一个对象,您应该使用它自己的prePersist/Update事件
看,,
在我的例子中,我意识到我不需要(双向的)一对多对多的关系,从而解决了这个问题
例如,在单向的一对一关系中,只需写下如下内容:
// Company Class:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<Person> persons = new HashSet<Person>();
// Person Class:
// - Remove the 3 lines
//公司类别:
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.ALL)
private Set persons=new HashSet();
//人员类别:
//-拆下3条管路
检查此示例:
如果这不能解决您的问题,请检查您是否在个人或公司课程中使用了Lombok
如果是这种情况,请在Company类中添加这两个注释(Person类则相反):
@数据
@实体
@EqualsAndHashCode(exclude={“persons”})//这个,
@ToString(exclude={“persons”})//这个
公共类公司实现可序列化{
// ...
私人组人员=。。。
/ ...
这是由Hibernate中的已知错误引起的,请参阅
不幸的是,我不知道有什么解决办法。谢谢。我还没有机会验证这一点,但我会在验证后更新这个问题。我本来打算用这个链接指定的基本版本添加我自己的hack,但我不知道这实际上是专家建议的方法。
@--ToOne => Default : FetchType.EAGER
@--ToMany => Default : FetchType.LAZY
@JoinColumn(name="COMPANY_ID", fetch = FetchType.EAGER)
private Company company;
// Company Class:
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Set<Person> persons = new HashSet<Person>();
// Person Class:
// - Remove the 3 lines
@Data
@Entity
@EqualsAndHashCode(exclude = { "persons"}) // This,
@ToString(exclude = { "persons"}) // and this
public class Company implements Serializable {
// ...
private Set<Person> persons = ...
/ ...