我在JPA EclipseLink中的用户和组之间有一个ManyToMany关系。我的实现看起来像这样:
用户类:
@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 Class:
@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 Persistence Services - 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 - &gt; group_user.GROUPID] 描述符:RelationalDescriptor(de.kapieren.mbm.server.model.GroupMembership - &gt; [DatabaseTable(group_user)])
异常[EclipseLink-59](Eclipse Persistence Services - 2.1.1.v20100817-r8050):org.eclipse.persistence.exceptions.DescriptorException 异常描述:实例变量[userId]未在域类[de.kapieren.mbm.server.model.GroupMembership]中定义,或者无法访问。 内部异常:java.lang.NoSuchFieldException:userId 映射:org.eclipse.persistence.mappings.DirectToFieldMapping [userId - &gt; group_user.USERID] 描述符:RelationalDescriptor(de.kapieren.mbm.server.model.GroupMembership - &gt; [DatabaseTable(group_user)])
异常[EclipseLink-0](Eclipse Persistence Services - 2.1.1.v20100817-r8050):org.eclipse.persistence.exceptions.DescriptorException 异常描述:访问主键对象时发生内部错误[202]。 内部异常:java.lang.NoSuchFieldException:groupId 描述符:RelationalDescriptor(de.kapieren.mbm.server.model.GroupMembership - &gt; [DatabaseTable(group_user)])
这里出了什么问题?
答案 0 :(得分:1)
@JanyToOnes应该使用@JoinColumn而不是@PrimaryKeyJoinColumn。
答案 1 :(得分:0)
我尝试使用Windows机器完全相同的代码,它没有问题。 我认为问题是MAC OS的JVM(我正在使用Mac OS)。所以我必须继续在Windows VM上工作。这个问题似乎由EclipseLink记录(例外59)。 这对我来说非常糟糕,我认为这将是我上次尝试Java的时候......
答案 2 :(得分:0)
你有一个UserBookPK
类,但在其他任何地方都没有引用它。我认为这应该是UserGroupPK
?在这种情况下,这是错误的。对于一个字段,字段应为User
和Group
的实例。它应该是Serializable(但由于某种原因不包括版本ID)。
更好的是,根本不要使用@IdClass
。它仅用于向后兼容。在GroupMemberShip
上放置代理键并使用它将所有内容链接在一起。或者,如果您确实需要复合主键,请转到@EmbeddedId
。由于这只是建模为对象的关系,这确实有意义。
您不一定需要映射中间类,有时会有@ManyToMany
。