2016-03-25 1 views
1

私は単純な多対多テーブルを持っています。 1つの用語は複数のカテゴリに属し、1つのカテゴリは複数の用語に割り当てられます。なぜHibernateは多対多関係テーブルの主キーを生成しませんか?

Term.java

@Entity 
public class Term implements Serializable { 

    @Id 
    @GeneratedValue 
    private long id; 

    @NotNull 
    @Size(min = 1, max = 100) 
    private String name; 

    @ManyToMany(mappedBy="terms") 
    private List<Category> categories = new ArrayList<Category>(); 

    ... 
    // getters and setters 
} 

Category.java

@Entity 
public class Category implements Serializable { 

    @Id 
    @GeneratedValue 
    private long id; 

    @NotNull 
    @Size(min = 1, max = 255) 
    private String name; 

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    private List<Term> terms = new ArrayList<>(); 

    // getters and setters 
} 

しかし、生成された交差点のテーブルには、 "" ここから分かるように、主キー、含まれていません。

MariaDB [wordDS]>describe Category_Term; 
+---------------+------------+------+-----+---------+-------+ 
| Field   | Type  | Null | Key | Default | Extra | 
+---------------+------------+------+-----+---------+-------+ 
| categories_id | bigint(20) | NO | MUL | NULL |  | 
| terms_id  | bigint(20) | NO | MUL | NULL |  | 
+---------------+------------+------+-----+---------+-------+ 

コンポジットキーは常にプライマリキーとして必要なのではなく、Hibernateによって自動的に作成されるはずですか?どうすれば自動的に作成できますか?

+0

なぜ結合テーブルにキーが必要なのですか? – chrylis

+0

キーがないと、テーブルに重複が許可されます。通常は避ける必要があります。 – user697911

答えて

3

Listの代わりにSetを使用して、一意性を強制してください。 Hibernateは主キーを生成します。

@ManyToMany(mappedBy="terms") 
private Set<Category> categories = new HashSet<Category>(); 

/* ... */ 

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
private Set<Term> terms = new HashSet<>(); 
+0

これが設定されていると、入力データのようにテーブルへのエントリの挿入順序が保持されませんか?私は実際にその順序を維持したい、それはテーブルの健全性チェックを行う方が簡単だからです。 – user697911

+0

私はあなたが 'HashSet'の代わりに' LinkedHashSet'を使うと、挿入の順序はテーブルに保存されるべきだと思います。しかし、試していない。一方、テーブルから 'Set'に戻ってマッピングすると、私はあなたが同じ順序を取得するとは思わない。私が知る限り、Hibernateの 'PersistentSet'は単に' HashSet'をラップします。 –

+0

通常、アソシエイティブテーブルの実装に設定されていますか?私はデータベース設計には全く新しいものです。 – user697911

0

変更SetList。このようにして、Hibernateは結合テーブルの主キーを生成します。

0

私が使用:

を予約するエンティティ

@ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "Book_Author", joinColumns = { @JoinColumn(name = "Author_Id",nullable = false) }, inverseJoinColumns = { @JoinColumn(name = "Book_Id", nullable = false) }) 
Set<Author> getAuthors(){ 
.................. 
} 
著者エンティティの

@ManyToMany(cascade = CascadeType.ALL, mappedBy = "authors") 
Set<Author> getBooks(){ 
.................. 
} 

とそのpostgreに生成するために:

create table book_author 
(
    bus_id integer not null 
     constraint fks1cidrw188x56mfa802xfj23j 
      references book, 
    equipment_id integer not null 
     constraint fkm0ll4he65a8gfasp0sqg5tp2l 
      references author, 
    constraint book_author_pkey 
     primary key (author_id, book_id) 
) 
; 

ので、主キーが生成されます2人の共同一緒に祈る

関連する問題