有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用Hibernate注释的java Lazy Onetoone可选双向映射

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

有什么办法可以避免吗?不仅在运行时,而且在POJO级别。我正在使用^{,所以不能考虑字节码增强

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


共 (2) 个答案

  1. # 1 楼答案

    我找不到完整但最少的@OneToOne的例子,所以就在这里。它既不依赖于hibernate版本,也不滥用@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
    }
    

    这就是表格的样子(假设是博士后):

    CREATE TABLE a (
        id bigint NOT NULL PRIMARY KEY,
    );
    
    CREATE TABLE b (
        id bigint NOT NULL PRIMARY KEY,
        FOREIGN KEY (id) REFERENCES a(id);
    );
    
  2. # 2 楼答案

    @OneToOne注释在hibernate中不起作用。请考虑^ {< CD2> },或者尝试使用^ {CD3}},如^ {CD1}}。你也可以尝试@PrimaryKeyJoinColumn

    另外@LazyToOne注释在JPA实现中不存在,您应该在那里使用@OneToOne(fetch = FetchType.LAZY, optional = false)