0

わからないのですが、Hibernate は自動的に動作するべきですか?

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

2つのフィールドを持つ関係テーブルを作成するために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),
4

1 に答える 1

0

Hibernate は最初のケースで一意の列を作成します@OneToMany。これは、カテゴリが最大で 1 つの親を持つことを hibernate に指示する which を使用しているためです。コメントアウトしたコードで@JoinTable@OneToMany@ManyToMany. そのため、この場合、hibernate は一意の制約を作成しません。

カテゴリの子は、カテゴリ自体を親として持っていると思います。mappedByその場合、 inを使用して、子または親のいずれかを関係の反対側として定義する必要があります@ManyToMany

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

@ManyToMany(mappedBy="childs")
private Set<Category> parents = new HashSet<Category>();
于 2012-09-17T18:19:19.883 に答える