【发布时间】:2018-10-16 11:27:07
【问题描述】:
我有两个实体:Box 和 Link。 (两者都继承自 _BaseClass,但我认为这无关紧要 - 虽然可能......)
所以一个 Box 包含链接 1、链接 2 和链接集合。
_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' 会将其显示为第一个元素。
怀疑:
我确定,这是由于映射
- 框:@OneToMany(mappedBy = "parent")
- 链接:@ManyToOne @JoinColumn(name = "parent_id")
他们还将这些链接链接到变量“link1”和“link2”中。
问题:
所以我的问题是:如何正确管理/注释?
- 以某种方式取消映射“link1”和“link2”?
- 将“link1”和“link2”注释为@Transient,以便引用仅由链接端设置? (如果这有效的话......)
【问题讨论】:
标签: jpa one-to-many one-to-one many-to-one