JPA OneToMany, всегда пусто - PullRequest
9 голосов
/ 26 февраля 2011

У меня двунаправленное отношение один ко многим и много ко одному. скажем, в компании много людей, а у людей есть одна компания, поэтому в компании

@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);
        }
    }
}

когда я отлаживаю это, я вижу, что поле персон в Company всегда пусто. когда я смотрю на тип коллекции лиц, это java.util.Vector. не уверен, что это актуально. я ожидал увидеть автозагрузку типа коллекции JPA.

что я делаю не так?

Ответы [ 4 ]

2 голосов
/ 16 октября 2012

Вы должны установить обе стороны ваших отношений.Когда вы создаете нового человека и устанавливаете его компанию, вы также должны добавить этого человека в сотрудников компании (сотрудников?).

Кроме того, вы не должны изменять другой объект в 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 голос
/ 28 февраля 2011

Добавить fetch = FetchType.Eager в аннотацию @ManyToOne. Вы добавили это с другой стороны отношений.

0 голосов
/ 23 мая 2019

В моем случае я исправил это, осознав, что мне не нужно (двунаправленное) отношение 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 = ...
/ ...
0 голосов
/ 27 сентября 2012

, если вы хотите получить personList в Company, используйте FetchType.EAGER. В JPA

@--ToOne    =>  Default :  FetchType.EAGER 
@--ToMany   =>  Default :  FetchType.LAZY

@JoinColumn(name="COMPANY_ID", fetch = FetchType.EAGER)
private Company company;
...