JPA映射@OneToOne自己的类

时间:2014-10-16 12:44:11

标签: sql database jpa

大家好我在将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的合作伙伴(姓名和姓氏)创建两列(外键)

2 个答案:

答案 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字段的解决方案应该在它可以使用的地方使用。