如何从集合和直接引用中正确引用 class

How to properly reference a class from a Collection and a direct Reference

我有两个实体:盒子和 Link。 (两者都继承自 _BaseClass,但我认为这不相关 - 可能是......)

所以一个盒子包含 link1、link2 和 Link 的集合。

_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<>();

}

Link:

@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;

}

问题:

怀疑:

我敢肯定,那是因为映射

他们还 link 那些 link 进入变量 'link1' 和 'link2'。

问题:

所以我的问题是:如何正确地manage/annotate?

您的映射不正确。

首先,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 实体中的三个不同的连接列(因此需要三个不同的父字段):

  • 知道哪个框包含 link 作为其 link1(OneToOne,OneToOne link1 关联的所有者方)
  • 知道哪个框包含 link 作为其 link2(OneToOne,OneToOne link2 关联的所有者方)
  • 知道哪个框包含 link 作为其 links 列表的元素之一(ManyToOne,OneToMany links 关联的所有者方)