2014-04-02 144 views
1

我一直试图通过名为Guardian的中间类来映射两个用户之间的一些“OneToOne”关系。当我尝试检索用户(和他的监护人)时,我从Glassfish(Open edition v4.0)得到内部服务器错误。然而,没有任何类型的堆栈跟踪或日志中显示的任何错误。我怀疑这个问题是我在JPA类中的映射。

包含OneToOne映射的映射类(OneToMany)的问题

开始我得到有关卫类我真的不明白两个警告服务器:

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

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

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

相关领域/注释:

SQL创建语句

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

回答

0

使用@JoinColumn代替@PrimaryKeyJoinColumn尝试。

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

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

,按照规范后者应该被用于连接一个实体子类的主表中的JOINED映射策略到它的父类的主表(可确切定义here

+0

这样取出初始警告。服务器仍然会引发500的HTTP状态。在日志文件中仍然没有出现错误的迹象。 – Anders

+0

好吧,那么我想你的应用程序或服务器本身还有其他问题。你能够访问应用程序的某个部分,或者它甚至不能成功部署? – Blekit

+0

我想我发现了这个问题。只有具有监护人的用户才会导致服务器崩溃。这会导致无限递归,因为监护人列表在Guardian对象本身的所有者值中被持久化。我需要找到一种方法来坚持用户在监护人而不需要坚持监护人名单。 – Anders