Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有相同主密钥和外键的一通_Java_Jpa_Orm - Fatal编程技术网

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