使用Hibernate批注的懒惰的一对一可选双向映射

时间:2018-08-18 15:26:45

标签: java hibernate

我想使用Hibernate批注创建一个懒惰的一对一双向“可选”映射。我知道@MappedBy@JoinColumn的正常使用会导致每次触发N + 1个查询。

有没有办法可以避免这种情况?不仅在运行时,而且在POJO级别。我正在使用Hibernate 4.3,所以不能考虑字节码增强。

如果没有出路,可以在单向映射中应用标准。例如,我有A <-> B,C -> A作为映射。我正在搜索B。当CC明显是单向的时,是否可以对A施加限制?

2 个答案:

答案 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
}