2013-05-29 35 views
-1

我有3個類,一個超類和兩個子類。每個子類都有另一個子類的集合,我想映射它們之間的一對多關係。我的超類是人,而這個子類被稱爲referrer和broker。我想表達的關係是一個推薦人可以有很多經紀人,一個經紀人可以有很多推薦人。Hibernate註釋創建關係

@Component 
@Entity 
@Table(name="Referrer") 
@PrimaryKeyJoinColumn(name="rowID") 
public class Referrer extends Person implements Serializable{ 

    private static final long serialVersionUID = 972571370198603227L; 

    @Column(name="rowId") 
    private String referrerID; 

    @ManyToOne(cascade=CascadeType.ALL) 
    @JoinColumn 
    private List<Broker> brokers = new ArrayList<Broker>(); 

和經紀看起來是這樣的:

@Component 
@Entity 
@Table(name="Broker") 
@PrimaryKeyJoinColumn(name="rowID") 
public class Broker extends Person implements Serializable { 

    private static final long serialVersionUID = 5648239413711716027L; 

    @Column(name="AdminID", nullable=true) 
    private String adminID; 

    @Column 
    private boolean isAdmin = false; 

    @OneToMany(cascade=CascadeType.ALL, mappedBy="referrer") 
    private List<Referrer> referrers = new ArrayList<Referrer>(); 

對經紀人的主鍵應該是一個名爲ROWID字段包含在人父之內。

我真的卡住了,所以任何幫助將不勝感激。

回答

2

最後你在這裏是一個ManyToMany的關係。拋開一個問題,你使用連接表嗎?它看起來就是這樣的情況。 Basicaly你試試這個:

@ManyToMany(cascade=CascadeType.ALL) 
     @JoinTable(
      name = "jointablename", 
      joinColumns = @JoinColumn(name = "FlexRowId"), 
      inverseJoinColumns = @JoinColumn(name = "FlexRowId") 
     ) 
private List<Referrer> referrers = new ArrayList<Referrer>(); 

基本上這就是你需要添加到兩個實體。也許你可以忽略@PrimaryKeyJoinColumn(name="FlexRowID")。但我必須承認,我不知道如何使用基本相同的列進行雙方映射。所以請保持我張貼在它的工作。

+0

我結束了使用一個連接表,並在連接表內做了一對多然後多對多。因此,經紀人和推薦人都有一對一,然後在我的聯合表中都有一對一的。 它似乎工作。我希望。 – JamesENL

+1

這種映射通常在連接表中有其他列時完成。如果連接表只有兩列(經紀人,推薦人的Pk),那麼它是頭頂上的。 http://stackoverflow.com/questions/5127129/mapping-many-to-many-association-table-with-extra-columns反正它的你的選擇,但只是說,有沒有不必要的管理crud的頭部映射到實體連接表 –

1

如果代理主鍵是人,然後我的做法是這樣的

  1. 定義一到一個連接人與經紀人之間的關係船上各有其表

  2. 使用人的PK在代理(使其雙向定向,使級聯將罰款)

  3. 重複相同的推薦人(它有自己的表)

  4. 外商ID發生器
  5. 引入另一箇中間表,它有兩個表(Broker和Referrer)的兩列(當然有不同的名字)複合PK。經紀人(和推薦人)使用多對多關係,並在中間表的相應PK欄上加入。