这是一个奇怪的场景,因为我正在使用一个遗产系统,我的结构无法改变。
场景是我有一个Element表,其中包含有关重要字段“type”和“value”的元素的各种数据。
对类型和值的各种组合进行分类。例如,类型2的所有元素和值“绿色”属于类别1.
我正在遗留系统中构建用户界面,允许用户在给定类型和值(显然)的情况下定义这些类别。我想要的是遗留系统在其休眠实体中包含一组类别。一个Category实际上是一个ElementCategory类型的枚举,我的一个遗留问题是遗留应用程序必须是定义我的模式的应用程序,所以它需要在我启动它时建立我的表。然后我使用该数据库 当我创建我的新前端时。以下是我在Element Entity中注释我的新集合的方法:
@CollectionOfElements(fetch=FetchType.EAGER,targetElement = ElementCategory.class)
@JoinTable(name = "Element_Category",joinColumns =
{@JoinColumn(name = "type", referencedColumnName="type"
@JoinColumn(name = "value", referencedColumnName="value")
})
@Column(name="category")
@Enumerated(EnumType.STRING)
public List<ElementCategory> getCategories() {
return categories;
}
问题在于,当我启动服务器时,创建的Element表对(type,value)有一个唯一约束,这是不正确的,可能有多个Elements具有相同的类型和值字段,它们只属于相同的类别OR类别,具体取决于element_category表的外观。
我知道我拥有的是多对多的设置,但我可以使用多对多,除非我的Elements类别字段包含一个类别实体的集合,但它不是它只是一组枚举。
这可以通过休眠实现吗?
继这个问题后,我尝试了另一种方法并创建了ElementCategory实体:
@Entity
@Table(name="ElementCategory")
public class ElementCategory implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
private String description;
public int getId() {
return id;
}
public void setId(int id) {
this.id =id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
@Override
public int hashCode() {
int hash = 1;
hash = hash * (17 + id);
hash = hash * 31 + description.hashCode();
return hash;
}
/*
* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(!super.equals(obj)) {
return false;
}
if(getClass() != obj.getClass()) {
return false;
}
ElementCategory other = (ElementCategory)obj;
return ((other.id == id) && (this.description.equals(other.description)));
}
}
将此映射到我的Element Entity类中,如下所示:
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "ELEMENT_ELEMENTCATOGORY", joinColumns = {
@JoinColumn(name = "type", referencedColumnName = "type"),
@JoinColumn(name = "value", referencedColumnName = "value") })
@Column(name = "category")
public List<ElementCategory> getCategories() {
return categories;
}
我已尝试在商店中放置$ unique = false $,但生成的表格仍然在我的Element表格中结束:
CONSTRAINT element_type_value_key UNIQUE (type , value )
我不希望它是唯一的,多元素可以具有该配置。
答案 0 :(得分:0)
@JoinTable(name = "Element_Category",
joinColumns = {@JoinColumn(name = "type_id") },
inverseJoinColumns = { @JoinColumn(name = "elementcategory_id") }
)
public List<ElementCategory> getCategories() {
return categories;
}