2016-03-25 21 views
1

Çoktan çoğa basit tablolarım var. Bir Dönem birden fazla Kategoriye ait olabilir ve bir Kategori birden çok Şart'a atanabilir.Hazırda bekletme neden çoktan çoğa ilişki tablosu için birincil anahtar oluşturmuyor?

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 
} 

Bununla birlikte, oluşturulan kesişim tablosu "" Burada da görüleceği gibi, bir birincil anahtar ihtiva etmez:

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 |  | 
+---------------+------------+------+-----+---------+-------+ 

Kompozit Anahtar her zaman birincil anahtar olarak kullanılmamalıdır ve Hazırda bekletme tarafından otomatik olarak oluşturulmalıdır? Bunu otomatik olarak nasıl oluşturabilirim?

+0

Birleştirme tablosunun neden bir anahtara ihtiyacı olur? – chrylis

+0

Bir anahtar olmadan, tabloda normal olarak sakınılması gereken kopyalara izin verilir. – user697911

cevap

3

Benzersizliği zorlamak için List yerine Set kullanın. Hazırda bekletme, birincil anahtarı oluşturur.

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

/* ... */ 

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

Eğer ayarlanmışsa, girişlerin tablolarına giriş sırası giriş verisinde olduğu gibi korunmaz mı? Tabloda akıl sağlığı kontrolü yapmak daha kolay olduğu için, bu siparişi tutmak istiyorum. – user697911

+0

"HashSet" yerine "LinkedHashSet" kullanırsanız, ekleme siparişi tabloda saklanmalıdır. Yine de denemedim. Öte yandan, tablodan “Set” e haritalama, aynı siparişi alacağınızı düşünmüyorum. Bildiğim kadarıyla, Hibernate'in "PersistentSet" sadece "HashSet" etrafında sarar. –

+0

Normal olarak ilişkilendirilmiş tablo uygulaması için kullanılır mı? Veritabanı tasarımı için oldukça yeni. – user697911

0

Değişim bir Set için List. Bu şekilde Hazırda Beklet, birleştirme tablosu için birincil anahtarlar oluşturur.

0

kullandığım:

Yazar varlık

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

için Kitap varlık

@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(){ 
.................. 
} 

için Ve onun Postgre'nin içinde oluşturmak: Yani

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

, birincil anahtar oluşturulur iki co için Birlikte toplanır.

İlgili konular