2014-10-16 5 views
0

Привет, ребята У меня проблема с отображением типаOneToOne в его классе. У меня есть класс Person, в котором человек женат и имеет дело с классом «Тот же человек», но это его жена. Внешний ключ - это имя и фамилия.JPA mapping @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;} 

Менеджер Sevice:

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(); 
    } 

как я могу решить эту проблему ?? В БД не создает две колонки (иностранный ключ) с партнером КЛЮЧИ Primare (имя и фамилия)

ответ

0

Две проблемы. 1, вы используете PrimaryKeyJoinColumns вместо JoinColumns. 2, вы указали одно поле «coniuge», которое будет использоваться в качестве ключа foriegn для названий полей имени и фамилии лица. Вам нужно указать поле для каждого.

Try:

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

Это позволит вам продолжать использовать ваш текущий составной первичный ключ. Вместо этого вместо этого нужно использовать решение Alan для создания уникального поля id.

+0

это решение, которое я искал !! Теперь вам нужно закрыть сообщение или как он работает здесь? спасибо, Zack. –

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

Это дает мне ошибку на «private Long id», так как другой класс (PersonPK), который определяет ключи класса Person, тогда решение принадлежит Chris. –

+0

Имейте PK, основанный на чье-то имя, явно смешно. –

+0

Согласен, но они просто тестировали, чтобы узнать, как использовать Hibernate, а также mappingsOneToOne, OneToMany и т. Д. И т. Д. –