如何实现多父和多子映射?

时间:2012-09-17 13:11:32

标签: java hibernate orm

我有Category,其中每个类别可以有多个子级(下级类别)和多个父级(上级类别)。

我按照以下方式映射:

@Entity
public class Category {

@Id
public String Url;

@OneToMany
private Set<Category> childs = new HashSet<Category>();

@OneToMany
private Set<Category> parents = new HashSet<Category>();

@OneToMany(cascade=CascadeType.ALL)
private Set<Person> persons = new HashSet<Person>();

public String Title;

public boolean Done;

我发现Hibernate用下表编码了这个实体

CREATE TABLE
category_category
(
    Category_Url VARCHAR(255) NOT NULL,
    parents_Url VARCHAR(255) NOT NULL,
    childs_Url VARCHAR(255) NOT NULL,
    PRIMARY KEY (Category_Url, childs_Url),
    CONSTRAINT FK8635931F3275D6D7 FOREIGN KEY (Category_Url) REFERENCES category (Url) ,
    CONSTRAINT FK8635931F569C2962 FOREIGN KEY (parents_Url) REFERENCES category (Url) ,
    CONSTRAINT FK8635931F6ADF3430 FOREIGN KEY (childs_Url) REFERENCES category (Url),
    CONSTRAINT parents_Url UNIQUE (parents_Url),
    CONSTRAINT childs_Url UNIQUE (childs_Url),

这是绝对错误的,因为某些行的子节点和父节点彼此不相关,不应包含在一个元组中。

我认为Hibernate将创建两个表category_category_1(Category_Url,childs_Url)category_category_2(Category_Url,parents_Url),其中包括从this到孩子和另一个 - 从this到父母。

为什么Hibernate会像它那样做,以及如何使它正确完成?

1 个答案:

答案 0 :(得分:1)

您可以使用@JoinTable

为链接表提供不同的名称
@OneToMany @JoinTable(name = "category_category_1")
private Set<Category> childs = new HashSet<Category>();

@OneToMany @JoinTable(name = "category_category_2")
private Set<Category> parents = new HashSet<Category>();