【问题标题】:Hibernate JPA: mappedBy reference exceptionHibernate JPA:mappedBy 引用异常
【发布时间】:2012-03-26 13:21:02
【问题描述】:

我想用 Hibernate JPA 映射以下类:

我的代码如下所示:

   @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

据我了解消息,在会员资格中找不到网格。但是正如你在代码中看到的那样,在 Membership 类中肯定有一个名为 grid 的变量。

有人知道出了什么问题吗?

更新:根据 cmets 中的建议,我还尝试使用 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:我将在明天晚上从头开始重写所有三个课程,如果有任何改变,我会更新这篇文章。

【问题讨论】:

  • Membership 类有两个@Id 字段,这个感觉不对。我认为这不是映射复合主键的正确方法。
  • 2个Id字段没有错,只要配上 IdClass。
  • 我尝试将 2 个 id 字段更改为 EmbeddedId,但仍然是同样的问题。
  • 如果您可以控制表格,您可以创建一个自动生成的 id 并将其他的标记为自然 id。 stackoverflow.com/questions/1212058/…
  • 您好,我也遇到了同样的问题,已经尝试过这里提出的解决方案,但仍然没有好的结果。你最终解决了这个问题吗?如果你这样做了,你是怎么做到的?提前谢谢!

标签: java hibernate jpa


【解决方案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>();
}

【讨论】:

  • 我也对点 ('.') 表示法不满意。我不得不对这个问题进行时间限制,并最终将 db 模式更改为生成(代理)键,从而规避了复合 FK 映射到复合 PK 问题。
  • @skoegl。感谢您的回答,但是当我尝试以这种方式映射一些“非懒惰收集”字段时出现异常。请看stackoverflow.com/questions/23312951/…。提前致谢。
【解决方案2】:

在我的脑海中:这不应该是相当的

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
}

【讨论】:

  • 我试过 IdClass 和 EmbeddedId。不幸的是仍然是同样的例外。
猜你喜欢
  • 1970-01-01
  • 2016-03-08
  • 2015-12-30
  • 2014-10-16
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2014-03-14
  • 1970-01-01
相关资源
最近更新 更多