【问题标题】:Hibernate one to zero or one mapping休眠一对零或一映射
【发布时间】:2009-05-08 19:13:39
【问题描述】:

我正在尝试在 Hibernate 中将一映射到“零或一”关系。我想我可能已经找到了一种使用多对一的方法。

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

class B {
  private A 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 似乎永远不会为空。

对此我能做些什么?

【问题讨论】:

  • 期待答案

标签: java hibernate


【解决方案1】:

就像博登说的,答案是在A中的多对一语句中加上not-found="ignore"。用注解做到这一点:

A 类:

@ManyToOne
@Cascade({ CascadeType.ALL })
@JoinColumn(name = "Id")
@NotFound(action=NotFoundAction.IGNORE)
private B 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】:

    答案是在 A 中的多对一语句中添加 not-found="ignore":

    <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】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 2013-05-23
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      相关资源
      最近更新 更多