【问题标题】:JPA OneToMany MappedBy relationshipsJPA OneToMany MappedBy 关系
【发布时间】: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 没有说明关系应该是单向的。

标签: java jpa


【解决方案1】:

必须放在关系中的 mappedBy 名称是类属性的名称,而不是表名。

所以把@OneToMany(mappedBy = "groupIp",...(注意大写)代替@OneToMany(mappedBy = "groupip",...

【讨论】:

  • 感谢您的工作。但是在HttpServletResponse 上,我得到了siteGroups,但没有得到GroupsIps
  • 我想您正在从 HTML 表单发送数据。看看stackoverflow.com/questions/24658195/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2014-07-30
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
相关资源
最近更新 更多