2009-05-08 2 views
10

Я пытаюсь сопоставить один с отношением «нуль или один» в спящем режиме. Кажется, я нашел способ использовать много-к-одному.Спящий режим от одного до нуля или один сопоставление

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"/> 

и отображение Класс Б указывает:

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

То, что я хотел бы для б утратившими когда не было найдено ни одного соответствия строки для B в базе данных. Поэтому я могу это сделать (в классе А):

if (b == null) 

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

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

+0

im с нетерпением жду ответа – Schildmeijer

+0

«к ответу» ofcourse – Schildmeijer

ответ

6

Ответ добавить не обретенной = «игнорировать» на многие-к-одному заявлению в A:

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

Я попытался просто добавить ленивым = «ложь» в В соответствии с рекомендацией Rob H, но это привело к HibernateObjectRetrievalFailureException каждый раз я загрузил а, который не имел B.

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

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

+2

Как это сделать с помощью аннотаций? – Nik

0

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

16

L икэ Боден сказал, что ответ является добавление not-found="ignore" в многие-к-одному заявлению в А. Делать это с аннотацией:

В классе А:

@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; 
Смежные вопросы