Hibernate JPA: исключение ссылки mappedBy - PullRequest
2 голосов
/ 26 марта 2012

Я хочу сопоставить следующие классы с 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

Насколько я понимаю сообщение, сетка не может быть найдена в Членстве.Но, как вы можете видеть из кода, в классе 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 ]

1 голос
/ 30 марта 2012

Вы должны иметь возможность использовать что-то вроде

@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>();
}
0 голосов
/ 26 марта 2012

От всей моей головы: разве это не должно быть скорее

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...