【问题标题】:Hibernate / JPA Collection of Elements with Many to Many relationship?具有多对多关系的 Hibernate / JPA 元素集合?
【发布时间】: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


【解决方案1】:

你可以试试这样的:

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

【讨论】:

  • 对不起,我不明白这一点,我的类别是根据元素中的“值”和“类型”对赋予元素的,你的答案是如何实现的?
  • 这更好地描述了我的新问题:stackoverflow.com/questions/9228005/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-30
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
相关资源
最近更新 更多