2010-05-06 14 views
15

¿Cómo creo una asignación opcional de uno a uno en el archivo hibernate hbm? Por ejemplo, supongamos que tengo una tabla Usuario y una última página visitada. El usuario puede o no tener una última página visitada. Aquí está mi actual asignación uno a uno en el archivo de HBM:Asignación uno a uno opcional en Hibernate

clase de usuario:

<one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update"> 

LastVisitedPage Clase:

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

El ejemplo anterior no permite la creación de un usuario quien no tiene una última página visitada. Un usuario recién creado aún no ha visitado ninguna página. ¿Cómo cambio la asignación hbm para hacer que la asignación userPrefs sea opcional?

Respuesta

12

Que yo sepa, Hibernate no es compatible con el one-to-one opcional (ver HHH-2007) por lo que tendrá que usar un falso many-to-one con not-null="false".

0

Si un usuario tiene a lo sumo una página last_visited, entonces hay dos casos:

(a) alguna usuario dado no tiene ninguna página last_visited, en cuyo caso no habrá ninguna tupla para este usuario en la last_visited_page tabla, (b) un usuario dado tiene exactamente una última página visitada, en cuyo caso habrá exactamente una tupla para este usuario en la última tabla_página_visitada.

Eso debería hacer obvio que ID de usuario es una clave candidata en su última tabla de páginas visitadas.

Y eso debería hacer obvio que debe declarar esa clave para el DBMS.

4

Estaba teniendo un problema similar, pero con anotaciones. Google me trajo aquí, así que si alguien más se encuentra en los mismos sitatuions, esto funcionó para mí:

http://opensource.atlassian.com/projects/hibernate/browse/ANN-725

Si está utilizando anotaciones, se puede utilizar el @NotFound (acción = NotFoundAction.IGNORE) anotación para que no obtenga una excepción. Solo asegúrate de que tu código verifique los valores nulos porque es posible que ahora no esté allí ;-)

9

Simplemente pasa la mayor parte del día tratando de hacer algo similar, finalmente encontré la siguiente solución (por si acaso, esto podría ser útil para otras personas)

@OneToOne 
@JoinColumn(name="ClassA_Id", referencedColumnName="ClassB_Id", nullable=true) 

la esperanza de que puedan ayudar a salvar a alguien algún tiempo

+2

Sólo un FYI - esta solución tiene problemas si utiliza Envers (que obtendrá este error: https: //hibernate.onjira. com/browse/HHH-3853). Sin embargo, Hibernate 3.6.8 ha solucionado el problema con un mapeo @OneToOne opcional. – Phyxx

Cuestiones relacionadas