2010-11-11 111 views
2

我在JPA EclipseLink中的用戶和組之間有一個ManyToMany關係。我的實現看起來像這樣:ManyToMany和JPA的問題EclipseLink

用戶類別:

@Entity 
@Table(name="mbm_user") 
public class User extends CanAccessBook{ 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(nullable = false) 
private Long id; 

@OneToMany(mappedBy="user",cascade=CascadeType.PERSIST) 
private List<GroupMembership> groups = new ArrayList<GroupMembership>(); 

    /** 
    GETTER & SETTER 
    **/ 
} 

組類:

@Entity 
@Table(name="mbm_group") 
public class Group extends CanAccessBook{ 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(nullable = false) 
private Long id; 

@OneToMany(mappedBy="group", cascade=CascadeType.PERSIST) 
private List<GroupMembership> users = new ArrayList<GroupMembership>(); 

    /** 
    GETTER & SETTER 
    **/ 
} 

GroupMembership類:

@Entity 
@Table(name = "group_user") 
@IdClass(UserGroupPK.class) 
public class GroupMembership { 

@Id 
@ManyToOne 
@PrimaryKeyJoinColumn(name="USERID") 
private User user; 

@Id 
@ManyToOne 
@PrimaryKeyJoinColumn(name="GROUPID") 
private Group group; 

@Temporal(TemporalType.DATE) 
private Date joinedAt = new Date(); 

@Temporal(TemporalType.DATE) 
private Date validUntil; 

    /** 
    GETTER & SETTER 
    **/ 
} 

UserBookPK類:

public class UserBookPK{ 

@Id 
@Column(name="BOOKID") 
private Long book; 

@Id 
@Column(name="USERID") 
private Long user; 

public Long getBook() { 
    return book; 
} 

public void setBook(Long book) { 
    this.book = book; 
} 

public Long getUser() { 
    return user; 
} 

public void setUser(Long user) { 
    this.user = user; 
} 
} 

我的JUnit測試報告是沒有錯誤的,但如果我測試它在我的Tomcat中,我發現了以下錯誤

例外[EclipseLink的-59](Eclipse持久服務 - 2.1.1.v20100817- r8050):org.eclipse.persistence.exceptions.DescriptorException 異常說明:實例變量[groupId]未在域類[de.kapieren.mbm.server.model.GroupMembership]中定義,或者無法訪問。 內部異常:java.lang.NoSuchFieldException:的groupId 映射:org.eclipse.persistence.mappings.DirectToFieldMapping [groupId-- > group_user.GROUPID] 描述符:RelationalDescriptor(de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable(GROUP_USER)])

異常[的EclipseLink-59](Eclipse持久服務 - 2.1.1.v20100817-r8050):org.eclipse.persistence.exceptions.DescriptorException 異常描述:實例變量[用戶id ]未在域類[de.kapieren.mbm.server.model.GroupMembership]中定義,或者它不可訪問。 內部異常:java.lang.NoSuchFieldException:用戶id 映射:org.eclipse.persistence.mappings.DirectToFieldMapping [userId-- > group_user.USERID] 描述符:RelationalDescriptor(de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable(GROUP_USER)])

異常[的EclipseLink-0](Eclipse持久服務 - 2.1.1.v20100817-r8050):org.eclipse.persistence.exceptions.DescriptorException 異常描述:內部錯誤期間,訪問主鍵對象[202]。 內部異常:java.lang.NoSuchFieldException:的groupId 描述:RelationalDescriptor(de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable(GROUP_USER)])

怎麼回事錯在這裏?

+0

開始提示:當您更改用戶的用戶,會發生什麼 - >用戶用戶標識... – 2010-11-11 16:13:23

+0

爲了完整起見,可您發佈的集團類爲好。 – 2010-11-11 16:14:22

+0

集團類仍然存在 – LeonS 2010-11-11 16:31:48

回答

0

我試着完全相同的代碼與Windows機器,它的工作沒有問題。 我認爲問題是MAC OS的JVM(我正在使用Mac OS)。所以我必須在Windows VM上繼續我的工作。此問題似乎由EclipseLink(例外59)記錄。 這對我來說是非常糟糕的,我認爲這將是我最後一次給Java一個嘗試....

1

對於@ManyToOnes,您應該使用@JoinColumn而不是@PrimaryKeyJoinColumn。

+0

沒有幫助,仍然是同樣的問題:(好奇的是,我的JUnit測試是可以的,但與Tomcat這些異常被拋出。 – LeonS 2010-11-12 10:11:19

0

你有一個UserBookPK類,但它沒有引用其他地方。我認爲這應該是UserGroupPK?在這種情況下,這是錯誤的。例如,字段應該是UserGroup的實例。它應該是可序列化的(但由於某種原因,不包括版本ID)。

更重要的是,不要用@IdClass可言。這只是爲了向後兼容。在GroupMemberShip上放置代理鍵並使用它將所有內容鏈接在一起。或者,如果您確實需要複合主鍵,請參閱@EmbeddedId。由於這僅僅是作爲對象建模的關係,這確實是有道理的。

你不一定需要或者地圖中間階級,有一個@ManyToMany,有時工作。