2009-11-19 81 views
0

實體A和B使用鏈接表AtoB具有多對多的關係。刪除休眠實體沒有(試圖)刪除關聯表(查看)條目

如果實體A被刪除,則通過休眠刪除相關鏈接。到現在爲止還挺好。

我的問題是,我的鏈接表是一個視圖隱藏一個更復雜的關係,並在這種情況下完美工作,除非當試圖從視圖中刪除鏈接行,導致數據庫抱怨。

@Entity A... 

@ManyToMany(fetch = FetchType.LAZY) 
    @JoinTable(name = "AtoB", 
    joinColumns = @JoinColumn(name = "A_ID"), 
    inverseJoinColumns = @JoinColumn(name = "B_ID")) 
public Set<A> getASet() { 
    return ASet; 
} 

有沒有辦法讓冬眠不刪除鏈接行?我還沒有找到任何級聯選項或在關聯上使用updateable=false等的功能。

回答

2

我遇到過這個問題,以下爲我工作:

@ManyToMany 
@JoinTable(name = "V_LoanSecuredUser", 
      joinColumns = @JoinColumn(name = "loanAdditionalInfo_id", updatable = false), 
      inverseJoinColumns = @JoinColumn(name = "userAuthentication_Id", updatable = false)) 
@Persister(impl = ReadOnlyCollectionPersister.class) 
@Immutable 
public class ReadOnlyCollectionPersister extends BasicCollectionPersister { 
    public ReadOnlyCollectionPersister(Collection collection, 
      CacheConcurrencyStrategy cache, Configuration cfg, 
      SessionFactoryImplementor factory) throws MappingException, 
      CacheException { 
     super(collection, cache, cfg, factory); 
    } 

    @Override 
    protected boolean isRowDeleteEnabled() { 
     return false; 
    } 

    @Override 
    protected boolean isRowInsertEnabled() { 
     return false; 
    } 
} 
+0

也爲我工作。謝謝 –

0

聽起來好像你可能錯誤地使用了「鏈接表」設計,如果你想將它建模爲ManyToMany關係。您可能需要考慮將存儲在此表中的額外項目拆分爲單獨的表格或存儲。

2

試試這個:

@ManyToMany(
    fetch = FetchType.LAZY, 
    cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH }) 
... 

梯級類型見JPA Annotations

+0

級聯設置會影響行爲到目標實體,而不是直接的associationTable。 –