[英]How to model a ManyToOne and ManyToMany relationship on the same table in Hibernate?
[英]How to use the @ManyToMany with two lists on the same table
我有一種情況,一個實體可以使用另一個實體,它可以被另一個實體使用,所以我定義了一個引用同一實體的ManyToMany關系,所以我可以有listUse和listUsedBy,並且兩者都保存在同一個表entity_usage中:
@ManyToMany
@JoinTable(name = "entity_usage",
joinColumns = {
@JoinColumn(name = "id_use", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "id_used_by", referencedColumnName = "id")})
private List<Entity> listUse;
@ManyToMany
@JoinTable(name = "entity_usage",
joinColumns = {
@JoinColumn(name = "id_use_by", referencedColumnName = "id")},
inverseJoinColumns = {
@JoinColumn(name = "id_use", referencedColumnName = "id")})
private List<Entity> listUsedBy;
例子 :實體A可以使用實體B和C ,因此實體B和C由A使用 。 現在我的問題是當我將b和C添加到listUse時,它們會持久保存在entity_usage中,但是當我嘗試顯示listUsedBy時我必須重新部署我的項目,否則listUsedBy仍然是空的,有沒有辦法刷新listUsedBy,當沒有擁有我的實體時重新部署我的項目。
這是一般方法:
@Entity
public class SomeEntity
{
@ManyToMany
@JoinTable(name = "entity_usage",
joinColumns = @JoinColumn(name = "using_id"),
inverseJoinColumns = @JoinColumn(name = "used_by_id"))
private Set<SomeEntity> using = new LinkedHashSet<>();
@ManyToMany(mappedBy = "using")
private Set<SomeEntity> usedBy = new LinkedHashSet<>();
public void addUsing(SomeEntity entity)
{
this.using.add(entity);
entity.usedBy.add(this);
}
public void addUsedBy(SomeEntity entity)
{
this.usedBy.add(entity);
entity.using.add(this);
}
}
並且它被使用:
public void someMethod(long parentEntityId, long childEntityId)
{
EntityManager em = getSomeEntityManager();
SomeEntity parentEntity = em.find(SomeEntity.class, parentEntityId);
SomeEntity childEntity = em.find(SomeEntity.class, childEntityId);
parentEntity.addUsing(childEntity);
}
通常這是一個事務EJB方法。
請注意,沒有必要em.merge
任何東西,因為實體已經由em.find
管理 。 無論如何,無論您使用哪種方法來管理實體(查詢,查找,保留,合並),請記住, 只有在管理兩個實體時調用addUsing
/ addUsedBy
才是 重要的 。
這是ORM邏輯無法自己處理的主要不連貫之一: 您必須通知兩個實體(父和子)它們的關系 。
僅在一側設置關系是不夠的 - 如果您只說A是B的父級,B仍然不知道誰是其父級。
但是,存在替代方法,例如僅設置關系的擁有方( parent.getChildren().add(child)
),flush和刷新子級。
盡管如此(因為我的皮膚經驗非常好),替代品在現實世界的復雜應用中很難處理。
作為旁注,除非您需要某種插入順序,否則我將使用Set
而不是List
作為關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.