Hibernate JPA:mappedBy引用异常

时间:2012-03-26 13:21:03

标签: java hibernate jpa

我想用Hibernate JPA映射以下类:

enter image description here

我的代码如下所示:

   @Entity
    public class Grid{
        @Id
        @GeneratedValue
        private Long id;
        @Column(unique=true)
        private String name;
        private String location;
        private BigDecimal costsPerCPUMinute;

        @OneToMany(mappedBy="grid")
        private List<Membership> mem;

            public List<Membership> getMem() {
             return mem;
            }
            public void setMem(List<Membership> mem) {
            this.mem = mem;
            }

@Entity
public class User extends Person{
    @Column(nullable=false, unique=true)
    private String username;
    @Column(length=16,columnDefinition="BINARY(16)") 
    private byte[] password;

    @OneToMany(mappedBy="user")
    private List<Membership> mem;

    public List<Membership> getMem() {
        return mem;
    }
    public void setMem(List<Membership> mem) {
        this.mem = mem;
    }


@SuppressWarnings("serial")
@Entity
public class Membership  implements Serializable{

    private Date registration;
    private Double discount;    
    @Id
    @ManyToOne
    private Grid grid;
    @Id
    @ManyToOne
    private User user;

    public Grid getGrid() {
        return grid;
    }
    public void setGrid(Grid grid) {
        this.grid = grid;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }

不幸的是,我得到以下例外:

Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: dst1.model.Membership.grid in dst1.model.Grid.mem

据我了解该消息,无法在会员资格中找到网格。但正如您在de代码中看到的那样,肯定会在Membership类中使用名为grid的变量。

有没有人知道哪里出错?

更新:根据评论中的建议,我还尝试使用IDClass或EmbeddedID更改成员资格类。 EmbeddedID版本如下所示:

 @SuppressWarnings("serial")
    @Entity    
public class Membership  implements Serializable{

        private Date registration;
        private Double discount;    
        @EmbeddedId
        private MembershipPK membershipPK;

        public Membership(){};

        public MembershipPK getMembershipPK() {
            return membershipPK;
        }

        public void setMembershipPK(MembershipPK membershipPK) {
            this.membershipPK = membershipPK;
        }

    @SuppressWarnings("serial")
    @Embeddable
    public class MembershipPK implements Serializable{
        @ManyToOne
        private Grid grid;
        @ManyToOne
        private User user;


        public Grid getGrid() {
            return grid;
        }
        public void setGrid(Grid grid) {
            this.grid = grid;
        }
        public User getUser() {
            return user;
        }
        public void setUser(User user) {
            this.user = user;
        }
    }

不幸的是,我仍然得到同样的例外。

更新2 :我将在明天晚上从头开始重写所有三个课程,如果有任何改变,请更新此帖子。

2 个答案:

答案 0 :(得分:1)

您应该可以使用类似

的内容
@Embeddable
public class MembershipId
{
       protected Grid grid;
       protected User user;
}

@Entity
public class Membership {
    @EmbeddedId
    MembershipId id;
}

@Entity
public class User {
    @OneToMany(mappedBy="id.user")
    private Set<Membership> memberships = new HashSet<Membership>();
}

答案 1 :(得分:0)

从头到尾:这不应该是

public class MembershipId implements Serializable {
  private Grid grid;
  private User user;

  // immutable constructor, getters, equals, and hashCode
}

@Entity
@IdClass(MembershipId.class)
public class Membership implements Serializable {

  @Id @ManyToOne
  private Grid grid;

  @Id @ManyToOne
  private User user;

  // rest of class
}

编辑:异常告诉您的是,您的Grid类有一个名为mem的字段,并且此字段所代表的实体需要一个网格字段,但没有一个。这是Grid.mem需要网格字段的地方:

@Entity
public class Grid{
...
  @OneToMany(mappedBy="grid")
  private List<Membership> mem;

此映射仅在Membership.class中有属性网格时才有效。如果您在IdClass中隐藏网格,Grid.mem无法找到它。你可以试试这个:

@Embeddable
public class MembershipId implements Serializable {
  private Grid grid;
  private User user;

  // immutable constructor, getters, equals, and hashCode
}

@Entity
public class Membership implements Serializable {

  @EmbeddedId
  private MembershipId id;

  @ManyToOne
  private Grid grid;

  @ManyToOne
  private User user;

  // rest of class
}