【问题标题】:Problem with ManyToMany and JPA EclipseLink多对多和 JPA EclipseLink 的问题
【发布时间】:2011-05-08 13:13:05
【问题描述】:

我在 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 Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DescriptorException 异常说明:域类[de.kapieren.mbm.server.model.GroupMembership]中没有定义实例变量[groupId],或者不可访问。 内部异常: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 Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DescriptorException 异常说明:域类[de.kapieren.mbm.server.model.GroupMembership]中没有定义实例变量[userId],或者不可访问。 内部异常:java.lang.NoSuchFieldException:userId 映射:org.eclipse.persistence.mappings.DirectToFieldMapping[userId-->group_user.USERID] 描述符:RelationalDescriptor(de.kapieren.mbm.server.model.GroupMembership --> [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 --> [DatabaseTable(group_user)])

这里出了什么问题?

【问题讨论】:

  • 开始提示:更改用户用户时会发生什么 --> 用户 userId...
  • 为了完整起见,您能否也发布您的 Group 课程。
  • Group 类还在

标签: java orm jpa eclipselink


【解决方案1】:

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

更好的是,根本不要使用@IdClass。它只是为了向后兼容。在GroupMemberShip 上放置一个代理键,并使用它将所有内容链接在一起。或者,如果您真的想要复合主键,请选择@EmbeddedId。由于这只是建模为对象的关系,因此确实有些道理。

您也不一定需要映射中间类,有一个 @ManyToMany 有时会起作用。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      对于@ManyToOnes,您应该使用@JoinColumn 而不是@PrimaryKeyJoinColumn。

      【讨论】:

      • 没有帮助,仍然是同样的问题 :( 奇怪的是我的 JUnit 测试还可以,但是使用 Tomcat 会抛出这些异常。
      猜你喜欢
      • 1970-01-01
      • 2013-01-23
      • 2012-05-28
      • 2021-04-10
      • 1970-01-01
      • 2018-09-15
      • 1970-01-01
      相关资源
      最近更新 更多