gpt4 book ai didi

java - 包含 OneToOne 映射的映射类 (OneToMany) 出现问题

转载 作者:太空宇宙 更新时间:2023-11-04 14:59:14 25 4
gpt4 key购买 nike

我一直在尝试通过名为 Guardian 的中间类来映射两个用户之间的一些“OneToOne”关系。当我尝试检索用户(及其监护人)时,我收到 Glassfish(开放版 v4.0)返回的内部服务器错误。但是,日志中没有显示任何类型的堆栈跟踪或任何错误。我怀疑问题是我在 JPA 类中的映射。

启动服务器时,我收到两个与 Guardian 类相关的警告,但我不太理解:

警告:映射到元素 [方法 getGuardianUserBean] 上的引用列名称 [GUARDIAN] 与映射引用上的有效 ID 或基本字段/列不对应。将使用所提供的引用列名称。

警告:映射到元素 [方法 getOwnerUserBean] 上的引用列名称 [OWNER] 与映射引用上的有效 ID 或基本字段/列不对应。将使用所提供的引用列名称。

SQL 创建语句:

create table HOMEFREE."user" (
userid integer GENERATED ALWAYS AS IDENTITY,
name varchar(255) not null,
displayname varchar(255) unique not null,
password varchar(255) not null,
tlf integer,
facebookID varchar(255),
googleid varchar(255),
authtoken varchar(255),
email varchar(255) unique not null,
primary key(userid)
);

create table HOMEFREE."guardian" (
guardianId integer GENERATED ALWAYS AS IDENTITY,
owner integer not null,
guardian integer not null,
confirmed boolean not null,
primary key(guardianId),
foreign key(owner) references homeFree."user"(userid),
foreign key(guardian) references homeFree."user"(userid)
);

实体类中的相关字段/注解:

@Entity
@Table(name = "\"user\"", schema = "HOMEFREE")
public class User implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int userId;

@OneToMany(mappedBy = "ownerUserBean", fetch = FetchType.EAGER)
private List<Guardian> guardians;
}

@Entity
@Table(name="\"guardian\"", schema="HOMEFREE")
public class Guardian implements Serializable {
private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int guardianId;

@OneToOne
@PrimaryKeyJoinColumn(name="OWNER", referencedColumnName="USERID")
private User ownerUserBean;

@OneToOne
@PrimaryKeyJoinColumn(name="GUARDIAN", referencedColumnName="USERID")
private User guardianUserBean;

private boolean confirmed;
}

最佳答案

尝试使用@JoinColumn而不是@PrimaryKeyJoinColumn

@OneToOne
@JoinColumn(name="OWNER", referencedColumnName="USERID")
private User ownerUserBean;

@OneToOne
@JoinColumn(name="GUARDIAN", referencedColumnName="USERID")
private User guardianUserBean;

根据规范,后者应该用于将 JOINED 映射策略中的实体子类的主表连接到其父类(super class)的主表(确切的定义可用here)

关于java - 包含 OneToOne 映射的映射类 (OneToMany) 出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22810041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com