i have a bidirectional, one to many, and many to one relationship. say, a Company has many Persons, and a Persons has one company, so, in company,
@OneToMany(mappedBy = "company", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Collection<Person> persons;
and in Person,
@ManyToOne
@JoinColumn(name="COMPANY_ID")
private Company company;
now, say i have a @PrePersist / @PreUpdate method on Company, where when it is updated, i want to set the same timestamp on all the People ... like,
@PrePersist
@PreUpdate
public void setLastModified() {
this.lastModified = System.currentTimeMillis();
if (persons != null) {
for (Person person : persons) {
person.setLastModified(this.lastModified);
}
}
}
when i debug this, i see that the persons field in Company is always empty. when i look at the type of the persons collection, it's a java.util.Vector. not sure if that's relevant. i expected to see some auto-loading JPA collection type.
what am i doing wrong?
You must set both sides of your relationship. When you create a new Person and set its Company you must also add the Person to the Company's persons (employees?).
Also, you should not change another object in one object's prePersist/Update, you should use its own prePersist/Update event.
See, http://en.wikibooks.org/wiki/Java_Persistence/Relationships#Object_corruption.2C_one_side_of_the_relationship_is_not_updated_after_updating_the_other_side
Add fetch = FetchType.Eager to @ManyToOne annotation. You added it on the other side of relationship.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With