我正在尝试将两个有序集合一对多字段映射到相同的值。这些字段具有不同的过滤要求。因此,一个字段将包含从另一个字段中过滤掉的项目。
这是实体的相关部分。
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>();
...
}
和例外
原因:org.hibernate.MappingException:实体映射中的重复列:com.casenet.domain.configuration.screen.OptionValue 列:option_value_set_id(应使用 insert="false" update="false" 映射) 在 org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:670) 在 org.hibernate.mapping.PersistentClass.checkPropertyColumnDuplication(PersistentClass.java:692) 在 org.hibernate.mapping.PersistentClass.checkColumnDuplication(PersistentClass.java:714) 在 org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:468) 在 org.hibernate.mapping.RootClass.validate(RootClass.java:215) 在 org.hibernate.cfg.Configuration.validate(Configuration.java:1135) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1320) 在 org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867) 在 org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669) ... 137 更多
出于好奇,我正在解开两个使用相同休眠字段的用例。目前,过滤器在一个中打开以隐藏禁用的选项值,在另一个中打开以编辑它们。但是,@Filter 注释会干扰缓存。我必须在不更改底层数据库架构的情况下解决这个问题。我们在发布周期中为时已晚,无法做任何更激进的事情。