如何从集合和直接引用中正确引用 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 搞砸了。 'link1' 和 'link2' 显示 'link'.
的第一个元素
- 反之亦然:如果我设置 'link1',则列表 'links' 会将其显示为第一个元素。
怀疑:
我敢肯定,那是因为映射
- 盒子:@OneToMany(mappedBy = "parent")
- Link: @ManyToOne @JoinColumn(name = "parent_id")
他们还 link 那些 link 进入变量 'link1' 和 'link2'。
问题:
所以我的问题是:如何正确地manage/annotate?
- 以某种方式取消映射 'link1' 和 'link2'?
- 将 'link1' 和 'link2' 注释为 @Transient,以便仅在 Link 端设置引用? (如果完全有效...)
您的映射不正确。
首先,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 关联的所有者方)
我有两个实体:盒子和 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 搞砸了。 'link1' 和 'link2' 显示 'link'. 的第一个元素
- 反之亦然:如果我设置 'link1',则列表 'links' 会将其显示为第一个元素。
怀疑:
我敢肯定,那是因为映射
- 盒子:@OneToMany(mappedBy = "parent")
- Link: @ManyToOne @JoinColumn(name = "parent_id")
他们还 link 那些 link 进入变量 'link1' 和 'link2'。
问题:
所以我的问题是:如何正确地manage/annotate?
- 以某种方式取消映射 'link1' 和 'link2'?
- 将 'link1' 和 'link2' 注释为 @Transient,以便仅在 Link 端设置引用? (如果完全有效...)
您的映射不正确。
首先,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 关联的所有者方)