Hibernate / JPA具有多对多关系的元素集合?

时间:2012-02-09 14:55:48

标签: java hibernate jpa many-to-many

这是一个奇怪的场景,因为我正在使用一个遗产系统,我的结构无法改变。

场景是我有一个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 )

我不希望它是唯一的,多元素可以具有该配置。

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情:

@JoinTable(name = "Element_Category",
joinColumns = {@JoinColumn(name = "type_id") },
inverseJoinColumns = { @JoinColumn(name = "elementcategory_id") }
)
public List<ElementCategory> getCategories() {
    return categories;
}