2009-05-08 13 views
10

Próbuję odwzorować jeden na relacji "zero lub jeden" w Hibernacja. Myślę, że mogłem znaleźć sposób na użycie wielu do jednego.Hibernacja jeden do zera lub jeden mapowanie

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

class B { 
    private A a; 
} 

mapowanie Klasa A za określa:

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

i mapowanie Klasa B za określa:

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

Co chciałbym to dla b, aby być zerowy, gdy nie wiersz pasujący do B został znaleziony w bazie danych. Więc mogę to zrobić (w klasie A):

if (b == null) 

Jednak wydaje się, że b nigdy nie jest zerowe.

Co mogę z tym zrobić?

+0

im czekam na odpowiedź – Schildmeijer

+0

"na odpowiedź" ofcourse – Schildmeijer

Odpowiedz

6

Odpowiedzią było dodanie not-found = "ignoruj" na wiele-do-jednego rachunku w A:

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

Próbowałem po prostu dodając leniwy = "false" do B jak zaleca Rob H, ale spowodowało, że za każdym razem HibernateObjectRetrievalFailureException ładowane z wyborem, który nie miał B.

Patrz wątek więcej informacji:

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

+2

Jak uzyskać to za pomocą adnotacji? – Nik

0

Spróbuj ustawić lazy = "false" na elemencie "jeden do jednego". To powinno zmusić Hibernate, aby spróbował pobrać powiązanie ("B") po załadowaniu pierwszego obiektu ("A"). Właściwość w "A" zostanie zainicjalizowana za pomocą rzeczywistego wystąpienia "B" lub wartości zerowej.

16

L ike Boden powiedział, że odpowiedź jest dodanie not-found="ignore" na wiele-do-jednego rachunku w A. Spowoduje to z dopiskiem:

W Klasa A:

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

w klasie 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; 
Powiązane problemy