代码之家  ›  专栏  ›  技术社区  ›  Boden

休眠一到零或一个映射

  •  11
  • Boden  · 技术社区  · 17 年前

    我正试图把冬眠中的一对关系映射为“零或一”。我想我可能找到了一种使用多对一的方法。

    class A {
      private B b;
      // ... getters and setters
    }
    
    class B {
      private A a;
    }
    

    类的映射指定:

    <many-to-one name="b" class="B" 
    insert="false" update="false" 
    column="id" unique="true"/>
    

    B类映射指定:

    <one-to-one name="a" class="A" constrained="true"/>
    

    我希望在数据库中找不到B的匹配行时B为空。所以我可以这样做(在A班):

    if (b == null)
    

    然而,似乎b永远不是空的。

    我该怎么办?

    3 回复  |  直到 9 年前
        1
  •  17
  •   DavidDuwaer    9 年前

    正如博登所说,答案是 not-found="ignore" 到a中的多对一语句。使用注释执行此操作:

    在A班:

    @ManyToOne
    @Cascade({ CascadeType.ALL })
    @JoinColumn(name = "Id")
    @NotFound(action=NotFoundAction.IGNORE)
    private B b
    

    乙班:

    @Id
    @GeneratedValue(generator = "myForeignGenerator")
    @org.hibernate.annotations.GenericGenerator(
        name = "myForeignGenerator",
        strategy = "foreign",
        parameters = @Parameter(name = "property", value = "a")
    )
    private Long subscriberId;
    
    @OneToOne(mappedBy="b")
    @PrimaryKeyJoinColumn
    @NotFound(action=NotFoundAction.IGNORE)
    private A a;
    
        2
  •  6
  •   Boden    17 年前

    答案是在a:

    <many-to-one name="b" class="B" not-found="ignore" insert="false" update="false" column="id" unique="true"/>
    

    我试着简单地按照rob h的建议将lazy=“false”添加到b中,但每次加载没有b的a时,都会导致HibernateObjectretrievalfailureException。

    有关详细信息,请参阅此线程:

    https://forum.hibernate.org/viewtopic.php?p=2269784&sid=5e1cba6e2698ba4a548288bd2fd3ca4e

        3
  •  0
  •   Rob H    17 年前

    尝试在多对一元素上设置lazy=“false”。这将强制Hibernate在加载第一个对象(“A”)时尝试获取关联(“B”)。“a”中的属性将由“b”的实际实例初始化,或者为空。