我有两个实体:Box和Link。 (两者都继承自_BaseClass,但我认为这不相关-可能是这样。。。)
因此,一个Box包含link1,link2和一个Links集合。
_BaseEntity:
@MappedSuperclass
public class _BaseEntity implements Comparable<_BaseEntity> {
@Expose //
@Id //
@GeneratedValue() //
protected long id;
public _BaseEntity() {}
public long getID() {
if (id == 0) return creationId;
return id;
}
@Override public final int hashCode() {
return (int) getID();
}
@Override public final boolean equals(final Object pObj) {
if (pObj == null) return false;
if (getClass() != pObj.getClass()) return false;
final _BaseEntity other = (_BaseEntity) pObj;
return id == other.id;
}
@Override public int compareTo(final _BaseEntity arg0) {
return (int) (getID() - arg0.getID());
}
}
方框:
@Entity
@Table(name = "PT_Box")
public class Box extends _BaseEntity {
@Expose private String name;
@Expose //
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "parent") //
private Link link1;
@Expose //
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "parent") //
private Link link2;
@Expose //
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true, mappedBy = "parent") //
private final ArrayList<Link> links = new ArrayList<>();
}
链接:
@Entity
@Table(name = "PT_Link")
public class Link extends _BaseEntity {
@ManyToOne(fetch = FetchType.EAGER) //
@JoinColumn(name = "parent_id") //
private final Box parent; // dont expose for not looping!
@Expose private String name;
@Expose private String link;
@Expose private Date lastUpdate;
@Expose private Date nextUpdate;
}
问题:
怀疑:
我确定,这是由于映射所致
他们还将这些链接链接到变量'link1'和'link2'。
问题:
所以我的问题是:如何正确管理/注释此问题?
答案 0 :(得分:1)
您的映射不正确。
首先,hashCode和equals()方法不应使用生成的ID。您可能应该没有任何equals或hashCode方法。这是最安全的方法(请参见http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#mapping-model-pojo-equalshashcode)
第二,集合必须为List类型,而不是ArrayList类型。
第三:在Link实体中需要三个不同的连接列(因此需要三个不同的父字段):