【发布时间】: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/…
-
您好,我也遇到了同样的问题,已经尝试过这里提出的解决方案,但仍然没有好的结果。你最终解决了这个问题吗?如果你这样做了,你是怎么做到的?提前谢谢!