我想用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
据我了解该消息,无法在会员资格中找到网格。但正如您在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 :我将在明天晚上从头开始重写所有三个课程,如果有任何改变,请更新此帖子。
答案 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
}