一对一具有相同的主键和外键

时间:2012-01-04 15:17:59

标签: java jpa orm

数据库

*user_account*
id (PK)
email
password

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

实体

  

@Table(名称= “user_detail”)   public class 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 个答案:

答案 0 :(得分:1)

您不能同时拥有@Id private Integer id;@JoinColumn(name="id"),您必须删除其中之一:我怀疑您确实需要详细信息中的主键,因此只需删除@Id行即可那里。

答案 1 :(得分:1)

如果UserAccount中的ID既是主键又是外键,则应将其声明为单个字段并进行相应映射。像这样:

@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;
}
相关问题