大家好我在将typeOneToOne映射到其类时遇到问题。我有一个人类,一个人结婚,并与同一类人有染,但这是他的妻子。外键是姓名。
@Table(name="PERSON")
public class Person implements Serializable{
@PrimaryKeyJoinColumns({@PrimaryKeyJoinColumn(name="coniuge",referencedColumnName="NAME"),@PrimaryKeyJoinColumn(name="coniuge",referencedColumnName="SURNAME")})
private Person coniuge = null;
@Id
@Column(name="NAME",nullable=false)
private String name;
@Id
@Column(name="SURNAME",nullable=false)
private String surname;
public Person getConiuge() {
return coniuge;}
经理服务:
public void aggiungiConiuge(Person coniugeA, Person coniugeB){
manager.getTransaction().begin();
Person cA = manager.find(Person.class, coniugeA);
Person cB = manager.find(Person.class, coniugeB);
cA.setConiuge(cB);
cB.setConiuge(cA);
manager.merge(cA);
manager.getTransaction().commit();
}
我该如何解决问题?在DB上没有使用Primare的合作伙伴(姓名和姓氏)创建两列(外键)
答案 0 :(得分:1)
由于forename / surname不保证是唯一的,请使用代理键和地图如下:
@Table(name = "PERSON")
public class Person implements Serializable {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.AUTO) //or some other strategy
private Long id;
@OneToOne()
@JoinColumn(name = "coniuge_id")
private Person coniuge;
@Column(name = "NAME", nullable = false)
private String name;
@Column(name = "SURNAME", nullable = false)
private String surname;
public void setConiuge(Person coniuge) {
this.coniuge = coniuge;
coniuge.coniuge = this;
}
}
答案 1 :(得分:0)
两个问题。 1,您正在使用PrimaryKeyJoinColumns而不是JoinColumns。 2,你指定了一个" coniuge"要用作引用的人员姓名和姓氏字段的外键的字段。您需要为每个字段指定一个字段。
尝试:
@OneToOne
@JoinColumns({@JoinColumn(name="CONIUGE_NAME", referencedColumnName="NAME"),
@JoinColumn(name="CONIUGE_SURNAME", referencedColumnName="SURNAME")})
private Person coniuge;
这将允许您继续使用当前的复合主键。下面用Alan生成一个唯一的id字段的解决方案应该在它可以使用的地方使用。