我想使用Hibernate批注创建一个懒惰的一对一双向“可选”映射。我知道@MappedBy
和@JoinColumn
的正常使用会导致每次触发N + 1个查询。
有没有办法可以避免这种情况?不仅在运行时,而且在POJO
级别。我正在使用Hibernate 4.3
,所以不能考虑字节码增强。
如果没有出路,可以在单向映射中应用标准。例如,我有A <-> B,
和C -> A
作为映射。我正在搜索B
。当C
与C
明显是单向的时,是否可以对A
施加限制?
答案 0 :(得分:0)
collections.Counter()
注释无法根据需要在休眠状态下工作。请考虑使用@OneToOne
或尝试使用@LazyToOne
之类的@OneToMany
。您也可以尝试@OneToOne
。
p.s。 JPA实现中没有@PrimaryKeyJoinColumn
批注,您应该在那里使用@LazyToOne
答案 1 :(得分:0)
我找不到 LAZY双向@OneToOne 的完整但最少的示例,所以就在这里。它既不依赖于休眠版本,也不滥用tf.data
。
父母
定义@OneToMany
并负责管理一致性/同步,但是在技术上不拥有该关系,因为它不能引用id
中的任何唯一索引(或者至少我们不希望这样做)添加冗余数据)。
B
孩子
通过重新使用父级@Entity
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@OneToOne(
mappedBy = "a",
cascade = CascadeType.ALL,
orphanRemoval = true,
fetch = FetchType.LAZY
)
private B b;
public void setB(B b) {
if (b == null) {
if (this.b != null) {
this.b.setA(null);
}
} else {
b.setA(this);
}
this.b = b;
}
// ... other setters/getters
}
的ID,从技术上拥有这种关系。
A
这是表格的外观(假设postgres):
@Entity
public class B {
@Id
// Not generated but shared with A
private Long id;
@OneToOne(fetch = FetchType.LAZY)
@MapsId
@JoinColumn(name = "id") // otherwise use "a_id" instead of "id" in the DB column
private A a;
// ... other setters/getters
}