ManyToMany和JPA EclipseLink出现问题

时间:2010-11-11 15:30:54

标签: java orm jpa eclipselink

我在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)])

这里出了什么问题?

3 个答案:

答案 0 :(得分:1)

@JanyToOnes应该使用@JoinColumn而不是@PrimaryKeyJoinColumn。

答案 1 :(得分:0)

我尝试使用Windows机器完全相同的代码,它没有问题。 我认为问题是MAC OS的JVM(我正在使用Mac OS)。所以我必须继续在Windows VM上工作。这个问题似乎由EclipseLink记录(例外59)。 这对我来说非常糟糕,我认为这将是我上次尝试Java的时候......

答案 2 :(得分:0)

你有一个UserBookPK类,但在其他任何地方都没有引用它。我认为这应该是UserGroupPK?在这种情况下,这是错误的。对于一个字段,字段应为UserGroup的实例。它应该是Serializable(但由于某种原因不包括版本ID)。

更好的是,根本不要使用@IdClass。它仅用于向后兼容。在GroupMemberShip上放置代理键并使用它将所有内容链接在一起。或者,如果您确实需要复合主键,请转到@EmbeddedId。由于这只是建模为对象的关系,这确实有意义。

您不一定需要映射中间类,有时会有@ManyToMany