2014-10-16 94 views
0

你好家伙我有一个问题,将typeOneToOne映射到它的类。我有一个Person类,一个人已经结婚,并与同一个人类有染,但是他的妻子。外键是名字和姓氏。JPA映射@OneToOne自己的类

@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,您正在使用PrimaryKeyJoinColumns而不是JoinColumns。 2,您指定了一个单独的“coniuge”字段用作引用人名和姓氏字段的foriegn键。您需要为每个字段指定一个字段。

尝试:

@OneToOne 
    @JoinColumns({@JoinColumn(name="CONIUGE_NAME", referencedColumnName="NAME"), 
     @JoinColumn(name="CONIUGE_SURNAME", referencedColumnName="SURNAME")}) 
    private Person coniuge; 

这将允许您使用当前的复合主键继续。艾伦的解决方案如下,以生成一个唯一的ID字段应该使用,而不是它可以。

+0

这是我正在寻找的解决方案!现在你必须关闭帖子或者它在这里的工作方式?谢谢你,Zack。 – 2014-10-17 10:12:25

1

由于用的名字/姓氏是不能保证是唯一使用代理键和如下图:

@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; 
    } 
} 
+0

因为另一个类(PersonPK)定义了Person类的关键字,所以它给了我错误的“私人长ID”,然后解决方案是克里斯 – 2014-10-17 10:17:12

+0

有一个PK基于某人的名字显然是荒谬的。 – 2014-10-17 10:20:09

+0

我同意,但他们只是测试学习如何使用Hibernate,以及映射一对一,一对多等。 – 2014-10-17 10:27:58