如果其中一个连接列不是该实体的标识符属性,是否可以使用注释在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 :(得分:0)
你可以这样做,但是你需要将关系设置为只读,因为hibernate不知道如何填充表item_tag。
我不认为您当前的映射会起作用,因为您在Item
中都有一个级联。如果您需要更多信息,请给我一个喊叫,我可以尝试整理样本映射