Java 具有相同主密钥和外键的一通
数据库Java 具有相同主密钥和外键的一通,java,jpa,orm,Java,Jpa,Orm,数据库 *user_account* id (PK) email password *user_detail* id(PK)(FK) name city 实体 @表(name=“user\u detail”) 公共类UserDetail实现可变量化{ @Id private Integer id; ... @OneToOne @JoinColumn(name="id") private UserAccount userAccount; } 错误 异常描述:字段[user\u detail.
*user_account*
id (PK)
email
password
*user_detail*
id(PK)(FK)
name
city
实体
@表(name=“user\u detail”)
公共类UserDetail实现可变量化{
@Id private Integer id;
...
@OneToOne
@JoinColumn(name="id")
private UserAccount userAccount;
}
错误
异常描述:字段[user\u detail.ID]存在多个可写映射。只有一个可以定义为可写,所有其他必须指定为只读。您不能同时拥有
@Id私有整数Id
和@JoinColumn(name=“id”)
,您必须删除其中一个:我怀疑您是否真的需要详细信息中的主键,因此只需从那里删除@id
行。如果用户帐户中的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;
}
您建议使用没有主键的表?不,只是为了从UserDetail
类中删除注释和字段。反正他也不需要,因为用户的详细信息是通过一对一的映射检索的。哦,我明白了。那么他会有一个没有ID的实体类?在我看来,这仍然是错误的。好吧,很明显,他的设计从一开始就有缺陷,除了偷懒地获取细节之外,他可能没有明显的理由想要一篇作文;我发现他真的不太可能从用户详细信息访问用户实体,所以简单的单向一对一是正确的选择。PK id获取详细信息,FK在用户引用中,基本内容。数据库中有两个表和一个实体类有意义吗?因为您正在做的是一个组合是的,它有意义。真正的问题可能是:有两张桌子有意义吗?
@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;
}