2012-08-23 145 views
0

讓我們以兩個實體AB爲例。每個A可能有許多相關B s。每個B只與一個A相關聯。我代表如下與Hibernate這樣的關係:Hibernate映射OneToMany關係的方式

@Entity 
public class A { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "AId") 
    private Long id; 

    @Column(name = "AName", nullable = false, unique = true) 
    private String name; 

    @OneToMany(cascade = CascadeType.ALL) 
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "AId") }, inverseJoinColumns = { @JoinColumn(name = "BId") }) 
    private Set<B> bs = new HashSet<B>(); 

} 


@Entity 
public class B { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "BId") 
    private Long id; 

    @Column(name = "BName") 
    private String name; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "BA") 
    private A a; 

} 

當我從這個映射生成DB,這裏就是我得到:

  • A
  • 連接表A_B有2列:AIdBIdAIdBId屬於主鍵。並且由於存在從AB的關聯(即,一個A可能具有許多關聯的B,並且一個B與恰好一個關聯A),所以在BId上添加了唯一約束。
  • B帶有列,包括BA這是foreign關鍵參照列AIdA

關於join table

  • 爲什麼Hibernate的映射關係OneToMany這種方式?
  • 它可以簡單地將主鍵定義爲由一列組成(BId),並且將執行相同的規則。
  • 是否有這樣的映射完成的原因?
  • 這種映射的優點/缺點是什麼?

我確切我正在使用Hibernate 4.1.6.Final

+0

用Hibernate創建表格不是好習慣。 – kapand

+0

我從來沒有爲一對多關係使用聯合列。你應該規範你的數據庫表。 – erencan

回答

0

我看到你試圖雙向關聯映射:從A到B,從B到A

關於連接表,爲什麼Hibernate的映射關係一對多這種方式?

因爲您指定了一個連接表。因爲你有雙向關聯

@OneToMany(cascade = CascadeType.ALL) 
@JoinColumn(name = "AId", nullable = false) 
private Set<B> bs = new HashSet<B>(); 

或更好:您可以映射沒有它@OneToMany關係

@OneToMany(cascade = CascadeType.ALL, mappedBy = "a") 
private Set<B> bs = new HashSet<B>(); 

...

@ManyToOne(optional = false) 
@JoinColumn(name = "AId", nullable = false) 
private A a; 

關於

是否有這樣的映射完成的原因? 這種映射的優點/缺點是什麼?

如果您有一個可選的一對多對象(例如B可能沒有A),那麼與連接表的映射非常有用。它允許您避免B表上的可爲空的AId列。