2012-09-17 66 views
0

我不明白,應該Hibernate自動工作嗎?如何正確實現@ManyToMany映射?

我有編碼以下Category實體:

@Entity 
public class Category { 

@Id 
public String Url; 

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

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

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

public String Title; 

public boolean Done; 

這將導致如下表創建

CREATE TABLE 
category_parents 
(
    Category_Url VARCHAR(255) NOT NULL, 
    parents_Url VARCHAR(255) NOT NULL, 
    PRIMARY KEY (Category_Url, parents_Url), 
    CONSTRAINT FK9BB292C83275D6D7 FOREIGN KEY (Category_Url) REFERENCES category (Url) , 
    CONSTRAINT FK9BB292C8569C2962 FOREIGN KEY (parents_Url) REFERENCES category (Url), 
    CONSTRAINT parents_Url UNIQUE (parents_Url), 

這是不正確,因爲parents_Url不應該是唯一的(多行應該被允許有同一父母)。

如果沒有@JoinTable規範

@Entity 
public class Category { 

@Id 
public String Url; 

@ManyToMany(cascade=CascadeType.ALL) 
//@JoinTable(name = "category_childs") 
private Set<Category> childs = new HashSet<Category>(); 

@ManyToMany(cascade=CascadeType.ALL) 
//@JoinTable(name = "category_parents") 
private Set<Category> parents = new HashSet<Category>(); 

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

public String Title; 

public boolean Done; 

我的代碼,我將有以下

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), 

如何讓Hibernate來創建關係表有兩個字段?

喜歡如下:

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

回答

0

休眠,因爲你正在使用@OneToMany它告訴Hibernate是一個類別最多有一個父第一種情況下創建一個唯一的列。在您註冊的代碼@JoinTable中,您還將@OneToMany更改爲@ManyToMany。這就是爲什麼在這種情況下hibernate不會創建唯一的約束。

我想這個類別的孩子有這個類別本身作爲父類。在這種情況下,或者兒童的父母或必須使用在mappedBy@ManyToMany被定義爲的關係的另一側:

@ManyToMany 
@JoinTable(name = "category_childs") 
private Set<Category> childs = new HashSet<Category>(); 

@ManyToMany(mappedBy="childs") 
private Set<Category> parents = new HashSet<Category>();