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

标签 java jpa eclipselink glassfish-4

我一直在尝试通过名为 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/

相关文章:

java - 如何从包含多个元素的对象中提取对象的单个元素

java - Servicemix 找不到 javax.validation 包

java - 多次调用 jparepository.save() 会抛出异常

java - 多个JTA事务: no session associated with the current transaction

java - 无法使用 Spring 的 WebServiceTemplate 将 Http header 添加到消息中

java.lang.IllegalArgumentException : Unknown parameter name : Diagnosticcentreid

jpa - 使用 CDI + WS/RS + JPA 构建应用程序

java - 绑定(bind) native 查询错误。 EclipseLink(JPA 2.1)

通过级联持久化对象的 JPA 事务/回滚行为

java - GWT 中的 Hibernate 序列化异常但 Eclipselink 中没有