2009-05-08 17 views
10

Estoy tratando de mapear una relación uno a "cero o uno" en Hibernate. Creo que puedo haber encontrado una manera de usar un muchos-a-uno.Hibernar uno a cero o un mapeo

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

class B { 
    private A a; 
} 

mapeo de Clase A especifica:

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

y mapeo de Clase B especifica:

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

Lo que me gustaría es que B sea nulo cuando no se encontró ninguna fila coincidente para B en la base de datos. Así que puedo hacer esto (en la clase A):

if (b == null) 

Sin embargo, parece que nunca es nula b.

¿Qué puedo hacer al respecto?

+0

Estoy esperando una respuesta – Schildmeijer

+0

"a una respuesta" por supuesto – Schildmeijer

Respuesta

6

La respuesta fue que añadir que no se encuentra-= "ignorar" a la cuenta de muchos-a-uno en A:

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

He intentado simplemente añadiendo lazy = "false" a B como se recomienda Rob H, pero que resultó en una cada vez HibernateObjectRetrievalFailureException cargué una a que no tenía B.

Ver este hilo para más información:

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

+2

¿Cómo se tiene esto utilizando anotaciones? – Nik

0

Intente establecer lazy = "false" en el elemento de varios a uno. Eso debería obligar a Hibernate a intentar recuperar la asociación ("B") cuando se carga el primer objeto ("A"). La propiedad en "A" se inicializará con una instancia real de "B" o nulo.

16

L ike Boden, dijo, la respuesta es añadir not-found="ignore" a la cuenta de muchos-a-uno en A. Hacer esto con anotación:

En Clase A:

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

de Clase 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; 
Cuestiones relacionadas