2011-02-17 21 views
0

如果連接列之一不是該實體的標識符屬性,是否可以使用註釋在Hibernate中使用註釋創建多對多關係?父實體有兩個不同的獨特屬性,我希望能夠使用任何一個作爲連接列,但我恐怕Hibernate可能不會允許這樣做。使用非標識符屬性爲連接列休眠多對多

在MySQL中,這與創建引用父表上的唯一列而不是主鍵的外鍵約束類似。

在我的MySQL數據庫中,我有一個連接表,其中一個父表有兩個不同的外鍵關係。這樣做是爲了支持具有相同數據庫表的兩組代碼,並且我試圖更新舊對象以使用新映射,因此我可以放棄對連接表中某個外鍵的支持。

我閱讀了文檔,找不到明確的關於這是否被支持的內容。任何有識之士將不勝感激。

謝謝!

這裏是Java類(簡化了這個問題,所以請原諒任何錯別字):

@Entity 
@Table(name="TAG") 
@org.hibernate.annotations.Table(appliesTo = "TAG") 
public class Tag implements Externalizable { 
    private Long id; 
    private String name; 

    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "TAG_ID", unique = true) 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Id 
    @Column(name = "NAME", unique = true) 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     name = name.toLowerCase(); 
     this.name = name; 
    } 

} 


@Entity 
@Table(name="ITEM") 
@org.hibernate.annotations.Table(appliesTo = "ITEM") 
public class Item implements Externalizable { 
    private Long id; 
    private String name; 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ITEM_ID") 
    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Column(name = "NAME") 
    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     name = name.toLowerCase(); 
     this.name = name; 
    } 

    //tag support 
    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}) 
    @Fetch(value = FetchMode.SELECT) 
    @JoinTable(name = "ITEM_TAG", joinColumns = {@JoinColumn(name = "ITEM_ID")}, inverseJoinColumns = @JoinColumn(name = "TAG_NAME", referencedColumnName="NAME")) 
    @OrderBy("name") 
    public Set<Tag> getTags() { 
     return tags; 
    } 

    public void setTags(Set<Tag> tags) { 
     this.tags = tags; 
    } 
} 

下面是MySQL表定義(簡化了這個問題):

mysql> desc tag; 
+--------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+--------+------------------+------+-----+---------+----------------+ 
| tag_id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name | varchar(255)  | NO | UNI | NULL |    | 
+--------+------------------+------+-----+---------+----------------+ 

mysql> desc item; 
+---------+------------------+------+-----+---------+----------------+ 
| Field | Type    | Null | Key | Default | Extra   | 
+---------+------------------+------+-----+---------+----------------+ 
| item_id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| name | varchar(255)  | NO |  | NULL |    | 
+---------+------------------+------+-----+---------+----------------+ 

mysql> desc item_tag; 
+-------------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+------------------+------+-----+---------+----------------+ 
| item_tag_id | int(10) unsigned | NO | PRI | NULL | auto_increment | 
| item_id  | int(10) unsigned | NO | MUL | NULL |    | 
| tag_id  | int(10) unsigned | NO | MUL | NULL |    | 
| tag_name | varchar(255)  | NO | MUL | NULL |    | 
+-------------+------------------+------+-----+---------+----------------+ 

回答

0

你可以做到這一點,但你需要將關係設置爲只讀,因爲hibernate並不聰明,因此無法知道如何填充表item_tag。

我不認爲你目前的映射將工作,因爲你有一個級聯在Item。如果您需要更多信息,請給我留言,我可以嘗試放置一個示例映射

+0

謝謝。我大概可以擺脫所有的級聯。我如何將關係設置爲只讀? –