Pregunta

Tengo una aplicación de primavera-hibernación que está fallando para mapear un objeto correctamente: básicamente tengo 2 objetos de dominio, un Post y una User. La semántica es que cada mensaje tiene 1 usuario correspondiente.

Los objetos de dominio miradas Post más o menos de la siguiente manera:

class Post {

  private int pId;
  private String attribute;
  ...
  private User user;

  //getters and setters here

}

Como se puede ver, Post contiene una referencia a User. Cuando cargo un objeto Post, quiero objeto User correspondiente para ser cargado (perezosamente - sólo cuando su necesario).

Mis PROYECCIÓN tiene la siguiente manera:

<class name="com...Post" table="post">
    <id name="pId" column="PostId" />
    <property name="attribute" column="Attribute" type="java.lang.String" />

    <one-to-one name="User" fetch="join"
        class="com...User"></one-to-one>
</class>

Y, por supuesto, tengo una asignación básica para User establecido.

En lo que respecta a mi esquema de la tabla, tengo una tabla llamada post con un UserId extranjera que los enlaces a la mesa user.

Me considera que la instalación debería funcionar, pero cuando me carga una página que las fuerzas de la carga diferida del objeto User, noto la siguiente consulta Hiberate está generando:

Select ... from post this_ left outer join user user2_ on this.PostId=user2_.UserId ...

Es evidente que esto es incorrecto:. Que debe ser unirse UserId de post con UserId de user, pero en cambio su PostId incorrectamente que llegó procedente del post (su clave primaria) con UserId de user

Algunas ideas? Gracias!

Actualizar : Gracias a un par de los puestos más abajo que ahora se dan cuenta de que debería haber estado usando un mapeo muchos-a-uno en lugar de uno-a-uno. He cambiado la asignación bajo post a lo siguiente:

<many-to-one name="User" class="com...User" column="uId"/>

Pero ahora me sale un error de tiempo de ejecución que me dice que no hay ningún atributo llamado uId. Esto tiene sentido ya que no tengo una columna uId en mi objeto de dominio post (Simplemente tengo una referencia a un objeto user). Ahora estoy realmente confundido en cuanto a cómo puedo Hibernate para darse cuenta de que necesita para mapear la clave externa de la tabla posterior a la tabla usuario. Debe agregar explícitamente un atributo uId al objeto de dominio post a ser un marcador de posición para la clave externa?

espero que estoy haciendo sentido ...

¿Fue útil?

Solución

Dado que un usuario tiene muchos mensajes, su asociación es de hecho un "uno-a-muchos", no un "uno-a-uno". Se debe trabajar si asigna en consecuencia.

Editar : Sí, puede asignar la propiedad Post.user en el poste con un "muchos-a-uno", o el conjunto User.posts de usuario con un "uno-a muchos", o ambas cosas. Tiene especificado el nombre de su columna de clave externa?

Edit2 : En Hibernate decirlo, una "columna" en la base de datos se asigna a una "propiedad" de Java en su clase. Es decir, el atributo de la columna contiene el nombre de la columna de clave externa en la base de datos, no el nombre de cualquier propiedad en su clase Java. Si leí tu pregunta correcta, se debe utilizar "identificación de usuario", no "uid".

Ah, y un fetch = "unir" no puede ser perezoso, ya que obliga a que el usuario se descargue en la misma consulta como el puesto.

Otros consejos

Esto es el comportamiento de un mapeo uno a uno. Por lo general, comparten una clave primaria. Hibernate es suponiendo que la clave primaria de post es teh misma que la clave primaria de usuario. Esta página resume este comportamiento.

Me sospechar que un usuario realmente puede tener más de una postes sin embargo. Eso hace que el mapeo uno-a-muchos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top