2009-03-22 19 views
7

Tengo un modelo de libro y de inventario asignado por número de ISBN, pero el ISBN no es la clave principal en ninguno. Los libros pertenecen a las librerías y el inventario es para un grupo de librerías (BookstoreChain). El inventario es compartido por todas las librerías que pertenecen a una BookstoreChain.ORM: Asignación de OneToOne en la columna Clave no primaria-Libro e inventario asignado por ISBN

Estoy usando la asignación Hibernate @OneToOne en el lado del libro para obtener información de inventario uniéndome a la columna ISBN. De alguna manera, Hibernate genera la consulta de combinación externa izquierda correctamente, pero el inventario es nulo en el objeto Libro. No es flojo cargado tampoco. Ignorando la librería y la cadena, ¿cómo hago un OneToOne o ManyToOne para unirme y obtener un inventario cuando se buscan los libros?

class Book{ 
@Id 
Long id 

@Column 
String isbn; 

@Column 
String title; 

@OneToOne(optional = true) 
@JoinColumn(name = "isbn", referencedColumnName = "isbn",insertable = false, updatable = false) 
Inventory inventory; 
} 

class Inventory{ 
@Id 
Long id 

@Column 
String chainId 

@Column 
String isbn 

@Column 
Long availableQty 
} 

Respuesta

0

just a guess: does name = 'ISBN' tiene que ser el mismo caso que el campo en el inventario?

+0

Eso no es un problema. El código que se muestra es solo indicativo. El verdadero problema está en algún lugar del OneToOne – Sathish

+0

bien, me tienes. Todavía no estoy usando anotaciones en mi proyecto de hibernación. Puede verificar que los datos realmente tengan la relación. – Martlark

1

dudo que esto no tiene nada que ver con el asunto, pero pensé que iba a tocar el tema de todos modos sólo para asegurarse de que no es un Gotcha que se pasa por alto:

Tenga en cuenta que cuando se utiliza referenciadoColumnName a una columna clave no primaria , la clase asociada tiene para ser Serializable.

de referencia: [http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html][1]

Sé que dijo que la combinación externa izquierda se está generando, pero pensé que el defecto traiga era perezoso si no se ha especificado. Quizás, la explicidad que especifica el modo de búsqueda puede arrojar resultados diferentes.

Por último, si está utilizando una consulta HQL, quizás publicarla con cualquier otra clase de entidad ayudará a la comunidad a ayudar a resolver el problema.

+0

El inventario es serializable. OneToOne está ansioso por defecto. Solo estoy usando una consulta de criterios para seleccionar Libro por ISBN y verifico si obtengo detalles de inventario – Sathish

1

Su esquema de base de datos no tiene sentido, basado en lo que ha mostrado aquí. La relación entre el libro y el inventario debe ser de uno a muchos; presumiblemente, el mismo libro está en varios inventarios, lo que significa que no puede asociar libros e inventarios solo con el isbn. Dado que el isbn no es único en todos los inventarios, tendrá múltiples filas en el inventario con el mismo isbn pero diferentes chainIds, ¿qué fila es la fila correcta para un determinado libro/isbn? El libro debe tener una clave externa para inventory.id, no inventory.isbn.

3

Tienes que nombrar a tu referencia de unión como algo más. isbn ya es una columna. Pruebe esto:

@OneToOne(optional = true) 
@JoinColumn(name = "inventory", referencedColumnName = "isbn",insertable = false, updatable = false) 
Inventory inventory; 
Cuestiones relacionadas