Спящий режим от одного до нуля или одно отображение
Я пытаюсь сопоставить одно отношение "нуль или одно" в 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.