Спящий режим от одного до нуля или одно отображение

Я пытаюсь сопоставить одно отношение "нуль или одно" в 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 было null, если в базе данных не найдено ни одной строки для B. Поэтому я могу это сделать (в классе A):

if (b == null)

Однако, кажется, что b никогда не является нулевым.

Что я могу сделать с этим?

Ответ 1

Ответ заключался в том, чтобы добавить not-found = "ignore" к оператору many-to-one в A:

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

Я попробовал просто добавить lazy = "false" к B, как рекомендовал Rob H, но это привело к исключению HibernateObjectRetrievalFailureException каждый раз, когда я загрузил A, у которого не было B.

Смотрите эту тему для получения дополнительной информации:

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

Ответ 2

Как сказал Боден, ответ заключается в том, чтобы добавить not-found="ignore" к оператору many-to-one в A. Выполнение этого с помощью аннотации:

В классе 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;

Ответ 3

Попробуйте установить lazy = "false" на элемент много-к-одному. Это должно заставить Hibernate попытаться получить ассоциацию ( "B" ), когда загружается первый объект ( "A" ). Свойство в "A" будет либо инициализировано реальным экземпляром "B", либо null.