2012-03-26 21 views
13

decir: Yo he siguientes entidades:entidad insertable con @OneToMany atributo

@Entity 
public class A { 
    @Id 
    @GeneratedValue 
    private Long id; 

    @Embedded 
    private B b; 

    //getters and setters 
} 

@Embeddable 
public class B { 
    @OneToMany 
    private List<C> cList; 
    //getters and setters 
} 

@Entity 
public class C { 
    @Id 
    @GeneratedValue 
    private Long id; 
    //other fields, getters and setters 
} 

Usando la función de esquema autogeneración con Hibernate consigo una tabla adicional, que contiene asignaciones entre A y C. Pero me gustaría implementar una relación de uno a varios al agregar id en C (por ejemplo, sin la tabla adicional).

¿Esto es posible? En caso afirmativo, ¿qué anotaciones debería usar para crear dicha asignación?

Respuesta

7

En general, esto es posible con la anotación @JoinColumn. Funciona también con dispositivos incrustables.

@OneToMany 
@JoinColumn(name="A_ID") 
private List<C> cList; 

Si usted no está satisfecho con el nombre A_ID para la columna dada en integrable, puede anular nombre de columna en la entidad A:

@AssociationOverride(name= "cList", 
     joinColumns = @JoinColumn(name="SOME_NAME_FOR_JOIN_COLUMN_IN_TABLE_C")) 
@Embedded 
private B b; 
+0

Pero ¿Cómo se especifica, que 'A_ID' es el identificador de entidad 'A'? – jFrenetic

+0

No tiene que especificar eso, las asignaciones dadas en B se evalúan en el contexto de A y es por eso que su proveedor de persistencia lo sabe. O tal vez quieras decir cómo sobrescribir el nombre de la columna: agregué un ejemplo para responder. –

+0

¡Muchas gracias! Eso funcionó para mí. Pensé que necesitaba decirle explícitamente al proveedor de persistencia de qué entidad obtener el 'id', pero resultó ser un poco más inteligente :) – jFrenetic

Cuestiones relacionadas