2010-12-21 20 views
7

Tengo dos entidades:Hibernate cascada de inserción no insertar clave externa

@Entity 
public class File 
....... 
@Id @GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 
@OneToMany(fetch=FetchType.LAZY, mappedBy="file", cascade=CascadeType.ALL) 
private List<Tag> tags; 
....... 
OTHER PROPERTIES 
....... 

@Entity 
public class Tag 
....... 
@Id @GeneratedValue(strategy=GenerationType.AUTO) 
private int id; 
@ManyToOne 
@JoinColumn(name="file_id") 
private File file; 
@Column 
private String tag; 
....... 
OTHER PROPERTIES 
....... 

Estoy tratando de insertar en archivos (y posteriormente TAG) de la siguiente manera:

File file = new File(); 
Tag tag = new Tag(); 
tag.setTag("tag1"); 
Tag2 tag2 = new Tag(); 
tag2.setTag("tag2"); 
List<Tag> tags = new ArrayList<Tag>(); 
tags.add(tag); 
tags.add(tag2); 
file.setTags(tags); 
---Add other file attributes here--- 

estoy insertando luego el archivo en mi DAO usando:

sessionFactory.getCurrentSession().saveOrUpdate(file); 

en mis registros que veo un inserto en mi mesa "archivo" y 2 se inserta en mi etiqueta de tabla, sin embargo, la clave externa en mi tabla de etiquetas que apunta a mi tabla de archivos (file_id) es NULL.

¿Qué podría estar haciendo mal?

Respuesta

13

No está configurando el archivo para una etiqueta, solo las etiquetas para un archivo. Recuerde que en OOP, a diferencia del Modelo Relacional, debe establecer ambos extremos de una relación. No puede navegar de Etiqueta a Archivo simplemente porque agregó un conjunto de Etiquetas a un Archivo. En su caso, puede simplemente navegar de Archivo a Etiqueta (es decir: enumerar todas las Etiquetas para un Archivo). No puede distinguir a qué archivo pertenece una etiqueta, mirando solo la etiqueta.

Lo que se hace por lo general es un método de ayuda en uno de los modelos, así:

public void addTag(Tag tag) { 
    this.tags.add(tag); 
    tag.setFile(this); 
} 

Ver this para un ejemplo (de banco de pruebas de Hibernate):

+1

Gracias, esto funcionó. Realmente, por alguna razón, pensé que Hibernate me haría la suposición de que quería que Tag fuera actualizado con mis archivos ya que tenía la relación anotada en ambos lados. –

+0

El enlace no existe más :(puede proporcionar otra fuente? – Filipe

+0

He cambiado la respuesta para que apunte a la versión más reciente. – jpkrohling

3

La clave externa en la base de datos refleja el estado de Tag.file (ya que Tag es el lado propietario de la relación como un "muchos" lado en una relación bidireccional de muchos a uno).

No puedo ver dónde lo configuró.

Cuestiones relacionadas