JPA OneToMany,总是空着的

时间:2011-02-26 00:28:22

标签: jpa one-to-many

我有双向,一对多,多对一的关系。比如说,一家公司有很多人,一个人有一家公司,所以,在公司里,

@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集合类型。

我做错了什么?

5 个答案:

答案 0 :(得分:2)

您必须设置双方的关系。当您创建新人员并设置其公司时,您还必须将人员添加到公司的人员(员工?)。

另外,你不应该在一个对象的prePersist / Update中更改另一个对象,你应该使用它自己的prePersist / Update事件。

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side

答案 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

检查以下示例: https://github.com/thombergs/code-examples/tree/master/spring-data/spring-data-rest-associations/src/main/java/com/example/demo

如果这不能解决您的问题,请检查您在“个人”或“公司”课程中是否使用了“ 龙目岛”

如果是这种情况,请在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

不幸的是,我不知道有任何解决方法。