Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JPA OneToMany,总是空的_Jpa_One To Many - Fatal编程技术网

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 = ...
/ ...