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

时间:2018-10-16 11:27:08

标签: jpa one-to-many one-to-one many-to-one

我有两个实体: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”显示了“ link”的第一个元素。
  • 反之亦然:如果我设置“ link1”,则列表“ links”会将其显示为第一个元素。

怀疑:

我确定,这是由于映射所致

  • Box:@OneToMany(mappedBy =“ parent”)
  • 链接:@ManyToOne @JoinColumn(name =“ parent_id”)

他们还将这些链接链接到变量'link1'和'link2'。

问题:

所以我的问题是:如何正确管理/注释此问题?

  • 以某种方式取消映射“ link1”和“ link2”吗?
  • 以@Transient注释“ link1”和“ link2”,以便仅由链接端设置引用? (如果可以的话……)

1 个答案:

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

  • 要知道哪个盒子包含链接作为其link1(OneToOne,OneToOne link1关联的所有者端)
  • 要知道哪个盒子包含链接作为其link2(OneToOne,OneToOne link2关联的所有者端)
  • 要知道包含链接的框是其链接列表的元素之一(ManyToOne,OneToMany链接关联的所有者)