【问题标题】:Lazy One-to-one Optional Bidirectional Mapping using Hibernate annotations使用 Hibernate 注释的惰性一对一可选双向映射
【发布时间】:2018-08-18 15:26:44
【问题描述】:

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

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

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

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    @OneToOne 注释在 hibernate 中无法根据需要工作。请考虑@LazyToOne 或尝试使用@OneToMany,如@OneToOne。您也可以尝试@PrimaryKeyJoinColumn

    附言@LazyToOne注解在JPA实现中不存在,你应该在那里使用@OneToOne(fetch = FetchType.LAZY, optional = false)

    【讨论】:

    【解决方案2】:

    我找不到LAZY双向@OneToOne的完整但最小的示例,所以在这里。它既不依赖休眠版本,也不滥用@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
    }
    

    儿童

    通过重用父 A 的 id 在技术上拥有关系。

    @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
    }
    

    这就是表格的样子(假设是 postgres):

    CREATE TABLE a (
        id bigint NOT NULL PRIMARY KEY,
    );
    
    CREATE TABLE b (
        id bigint NOT NULL PRIMARY KEY,
        FOREIGN KEY (id) REFERENCES a(id);
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 2022-01-03
      相关资源
      最近更新 更多