OneToOne с тем же PrimaryKey и ForeignKey - PullRequest
0 голосов
/ 04 января 2012

База данных

*user_account*
id (PK)
email
password

*user_detail*
id(PK)(FK)
name
city

Объекты

@ Table (name = "user_detail") открытый класс UserDetail ImplementsSerializable {

@Id private Integer id;
...
@OneToOne
@JoinColumn(name="id")
private UserAccount userAccount;

}

@Table(name="user_account")
public class UserAccount implementsSerializable{
    @Id private Integer id;
    @OneToOne(mappedBy="userAccount")
    private UserDetail userDetails;
}

Ошибка Исключение Описание: Для поля [user_detail.ID] существует несколько сопоставлений с возможностью записи.Только один может быть определен как доступный для записи, все остальные должны быть указаны только для чтения.

Ответы [ 2 ]

1 голос
/ 04 января 2012

Если идентификатор в UserAccount является и первичным ключом, и внешним ключом, вы должны объявить его как одно поле и отобразить его соответствующим образом.Например:

@Entity
public class UserAccount implements Serializable {
    @Id
    @OneToOne(mappedBy="userAccount")
    private UserDetail userDetails;
}

Или с использованием @MapsId.

Однако я подозреваю, что вам действительно нужен один класс, распределенный по двум таблицам:

@Entity
@Table(name = "user_account")
@SecondaryTable(name = "user_detail")
public class User implements Serializable {
    @Id
    private int id;
    private String email;
    private String password;
    @Column(table = "user_detail")
    private String name;
    @Column(table = "user_detail")
    private String city;
}
1 голос
/ 04 января 2012

У вас не может быть обоих @Id private Integer id; и @JoinColumn(name="id"), вы должны удалить один из них: я сомневаюсь, что вам действительно нужен первичный ключ в деталях, поэтому просто удалите строку @Id оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...