簡體   English   中英

如何在同一個表上使用@ManyToMany和兩個列表

[英]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可以使用實體BC ,因此實體BCA使用 現在我的問題是當我將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM