【发布时间】:2012-02-09 14:55:47
【问题描述】:
这是一个奇怪的场景,因为我正在使用一个我无法更改其结构的遗留系统。
场景是我有一个元素表,其中包含有关元素的各种数据,其中包含重要字段“类型”和“值”。
对类型和值的各种组合进行分类。例如,所有类型 2 且值为“green”的元素都属于类别 1。
我正在为遗留系统构建一个用户界面,允许用户在给定类型和值的情况下定义这些类别(显然)。我想要的是遗留系统在它的休眠实体中包含一组类别。 Category 实际上是 ElementCategory 类型的枚举,我的职责之一是遗留应用程序必须是定义我的模式的应用程序,因此它需要在我启动它时建立我的表。然后我使用那个数据库 当我创建我的新前端时。以下是我在我的元素实体中注释我的新集合的方式:
@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 具有相同的 type 和 value 字段,它们只是属于相同的类别或类别,具体取决于 element_category 表的外观。
我知道我拥有的是多对多设置,但我不能使用多对多,除非我的 Elements 类别字段包含类别实体的集合,但它不仅仅是一组枚举。
这完全可以用hibernate实现吗?
从这个问题开始,我尝试了另一种方法并创建了 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)));
}
}
像这样在我的元素实体类中映射它:
@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 )
我不希望它是唯一的,多个元素可以有这样的配置。
【问题讨论】:
-
因此,在开始无法找到此问题的答案的情况下,我不得不将 ElementCategory 放入一个实体并将我的数据存储在数据库中(这很好)我将关系与 ManyToMany 建立了关系,并且Hibernate 仍在使用类型和值对上的唯一约束创建我的 Element 表。我不明白这如何等同于“多对多”,我无法弄清楚如何将其关闭。请帮忙?
-
如果将 id 属性添加到 ElementCategory 实体,它是否仍然会产生唯一约束?
-
是的,它已经有一个带有@id 注释的id 属性。如果决定只允许一个元素拥有该特定对,我看不出这是多对多的关系?
-
ElementCategory 是否有 mappedBy 属性?您能否发布 ElementCategory 类和包含 List
的类 -
我已编辑原始帖子以包含此内容。
标签: java hibernate jpa many-to-many