2014-04-02 184 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