【发布时间】:2017-01-23 04:34:44
【问题描述】:
我有三个类,Site、GoupIP 和 IP
一个站点有一个或多个组 IP。 一个 GroupIP 有一个或多个 IP。
代码如下:
网站
@Entity
@Table(name = "site")
public class Site implements Serializable {
private Set<GroupIp> groups;
@OneToMany(mappedBy = "site", fetch = FetchType.EAGER, cascade =CascadeType.ALL)
public Set<GroupIp> getGroups() {
return groups;
}
public void setGroups(Set<GroupIp> groups) {
this.groups = groups;
}
}
群组IP
@Entity
@Table(name = "groupip")
public class GroupIp implements Serializable {
private Set<Ip> ips;
private Site site;
@ManyToOne(cascade = CascadeType.MERGE)
@JoinColumn(name = "site_id")
public Site getSite() {
return site;
}
@OneToMany(mappedBy = "groupip", fetch = FetchType.EAGER, cascade =CascadeType.ALL)
public Set<Ip> getIps() {
return ips;
}
public void setIps(Set<Ip> ips) {
this.ips= ips;
}
}
IP
@Entity
@Table(name = "ip")
public class Ip implements Serializable {
private GroupIp groupIp;
@ManyToOne(targetEntity = GroupIp.class,cascade = CascadeType.MERGE)
@JoinColumn(name = "groupip_id", nullable=false)
public GroupIp getGroupIp() {
return groupIp;
}
public void setGroupIp(GroupIp groupIp) {
this.groupIp = groupIp;
}
}
在 GroupIp 课上,我得到:
在属性“ips”中,“映射者”值“groupip”无法解析为目标实体上的属性。
我的代码有什么问题??
【问题讨论】:
-
为什么在
GroupIP中使用@ManyToOne?没有必要使用它,因为Site类已经定义了一对多的关系,因此它将创建一个表来映射这些行。如果你试图在你的类之间实现单向关系,那么你做错了。见here。 -
将 mappedBy = "groupip" 替换为 mappedBy = "groupIp"
-
@px06 他在哪里声明他希望站点-groupip 关系是单向的?另请注意,如果您需要双向关系,则需要映射双方,但要让其中一方成为关系的所有者。
-
@Thomas 也许我在这方面没有足够的经验,但我遇到的所有使用
OneToMany的方式,都不应该在同一位置创建ManyToOne场地..?如果Site是所有者,那么我们可以通过在GroupIP中执行引用它:referencedColumnName再次使用;OneToMany -
@px06 我想说在大多数情况下
OneToMany与双向关系一起使用,并且关系的实际所有者是多方,因为这不需要额外的表。因此,您需要将mappedBy添加到OneToMany以告诉 JPA 关系的另一方是所有者,即只保留对另一方的更改。当然,双向关系还需要在多方面使用ManyToOne。 JPA 2 引入了您描述的映射,即使用@JoinColumn,但同样:OP 没有说明关系应该是单向的。