2012-05-24 21 views
0

我試圖將兩個有序的集合一對多的字段映射到相同的值。這些字段有不同的過濾要求。所以一個領域會有物品被過濾掉。休眠:如何讓兩個收集字段指向相同的對象

以下是實體的相關部分。

public class OptionValueSet extends ConfigurationDomainObject { 
    ... 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = OPTION_VALUE_SET_ID_COLUMN, nullable = false) 
    @IndexColumn(name = "option_index", nullable = false) 
    @Where(clause = OBSOLETE_FILTER) 
    private final List<OptionValue> allOptions = new java.util.ArrayList<OptionValue>(); 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @JoinColumn(name = OPTION_VALUE_SET_ID_COLUMN, nullable = false, insertable = false, updatable = false) 
    @IndexColumn(name = "option_index", nullable = false) 
    @Where(clause = OBSOLETE_FILTER + " AND disabled = '0'") 
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) 
    @Immutable 
    private final List<OptionValue> options = new java.util.ArrayList<OptionValue>(); 

    ... 
} 

和異常

 
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: com.casenet.domain.configuration.screen.OptionValue column: option_value_set_id (should be mapped with insert="false" update="false") 
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:670) 
    at org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:692) 
    at org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:714) 
    at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:468) 
    at org.hibernate.mapping.RootClass.validate(RootClass.java:215) 
    at org.hibernate.cfg.Configuration.validate(Configuration.java:1135) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) 
    ... 137 more 

對於好奇,我在解開正在使用同一個Hibernate場兩個用例的過程。目前,過濾器已打開,其中一個隱藏了禁用的OptionValues,留在另一個編輯它們。但是,@Filter註釋會干擾緩存。我必須在不更改底層數據庫模式的情況下修復此問題在發佈週期中我們太晚了,沒有做任何更激進的事情。

回答

1

因爲無論如何這些集合都被熱切地提取出來,爲什麼不簡單地添加一個返回allOptions的過濾視圖(或副本)的getOptions()方法?

public List<OptionValue> getOptions() { 
    List<OptionValue> result = new ArrayList<OptionValue>(allOptions.size()); 
    for (OptionValue o : allOptions) { 
     if (!o.isDisabled()) { 
      result.add(o); 
     } 
    } 
    return result; 
} 
+0

我遇到了一個類似的問題,我試圖創建三個單獨的列表,每個列表在春季休眠應用程序中都有相同對象類型的不同過濾器。你有一點時間來幫助我找出解決方案嗎?問題是在這個鏈接:http://stackoverflow.com/questions/20292152/parameterizing-object-properties – CodeMed

0

在Hibernate中,你的想法都映射到同一領域兩次(在這種情況下,一個子列表;如果你映射一個簡單的屬性兩次,你會得到同樣的錯誤消息)。 Hibernate無法處理它,因爲在更新或插入之後,狀態可能是無效的(如果被映射兩次的對象在Java代碼中獲得更新的不同值,應該如何休眠?)。

如果其中一個字段僅用於閱讀,則可以將字段映射兩次。在屬性簡單的情況下,錯誤信息已經告訴您如何操作(insert="false" update="false")。對於您的子列表,您可能還必須將cascade設置爲none作爲只讀屬性。