JPA 2/Hibernate - Best way to update complex entities?
I'm new to JPA/Hibernate and I'm wondering, what is usually the best way of updating a complex entity?
For example, consider the entity below:
@Entity
public class Employee {
@Id
private long id;
@Column
private String name;
@ManyToMany
private List<Positions> positions;
// Getters and setters...
}
What is the best way to update the references to positions? Currently a service is passing me a list of positions that the employee should have. Creating them is easy:
for (long positionId : positionIdList) {
Position position = entityManager.find(positionId);
employee.getPositions.add(position);
}
entityManager.persist(employee);
However, when it comes to updating the employee, I'm not sure what the best way of updating the employees positions would be. I figure there is two options:
I parse through the list of position id's and determine if the position needs to be added/deleted (this doesn't seem like a fun process, and may end up with many delete querie开发者_StackOverflows)
I delete all positions and then re-add the specified positions. Is there a way in JPA/Hibernate to delete all children (in this case positions) with one sql command?
Am I thinking about this the wrong way? What do you guys recommend?
How about
employee.getPositions.clear(); // delete all existing one
// add all of them again
for (long positionId : positionIdList) {
Position position = entityManager.find(positionId);
employee.getPositions.add(position);
}
although it may not be the most efficient approach. For a detail discussion see here. Cascading won't help here much because in ManyToMany relation the positions may not get orphaned as they may be attached to other employee (s), or even they shouldn't be deleted at all, because they can exists on their own.
JPA/Hibernate has support for this. It's called cascading. By using @ManyToMany(cascade=CascadeType.ALL)
(or limit the cascade type to PERSIST
and MERGE
), you specify that the collection should be persisted (merged/deleted/etc) when the owning object is.
When deletion is concerned, there is a special case, when objects become "orphans" in the database. This is handled by setting orphanRemoval=true
精彩评论