2010-09-21 15 views
6

Tengo una pregunta sobre las asignaciones de Hibernate ManyToMany. Tengo dos clases A y B y la correspondencia entre ellos es un mapeo ManyToMany resuelto por Hibernate:Cómo agregar una clave principal separada a una tabla de unión en Hibernate

@Entity 
@Table(name="A") 
public class A { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany 
    @JoinTable(name="C", [email protected](name="a_id"), [email protected](name="b_id")) 
    private Set bs; 
} 

@Entity 
@Table(name="B") 
public class B { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @ManyToMany(mappedBy="bs") 
    private Set bs; 
} 

Como se puede ver, la tabla de unión que utilizo es C. Las claves ajenas a A y B son "A_ID "y" b_id ". Según entiendo, Hibernate crea una clave principal compuesta con a_id y b_id para la tabla C.

No deseo tener una entidad C en mi modelo. Pero en lugar de una clave primaria compuesta en la tabla C, me gustaría tener una ID generada y una restricción única en los campos a_id y b_id.

¿Es posible decirle a Hibernate que use una clave principal separada? Sin agregar una entidad C?

Agradeceria cualquier ayuda.

¡Muchas gracias!

Respuesta

1

No creo que sea posible. Y no veo ningún problema en la definición de una entidad C.

Si tiene información adicional en la tabla de unión, no podrá acceder a ella, ya que su Set contiene la entidad de destino - A o B.

Además, su Set s haría mejor uso de genéricos, es decir, Set<A> y Set<B>.

Por cierto, Hibernate podría no alarmarse por el hecho de que la tabla crea otra entidad, podría funcionar su mapeo actual (sin tener en cuenta completamente la columna de identificación). Cuando dijiste "Hibernate crea", asumí que estás generando tu esquema a partir de tu modelo de entidad. Ahora parece que es todo lo contrario, así que pruébalo.

+0

El punto es que la base de datos ya existe con la estructura dada (y debido a razones heredadas no es realmente adaptable). La tabla no tiene más que los tres campos sobre los que escribí (id, a_id, b_id). Sería bueno insertar nuevas entradas en C sin crear una entidad C (inútil) en mi código. Pero gracias de todos modos por la respuesta. Supongo que simplemente tengo que crear esta entidad, entonces ... – BHulliger

+0

@BHulliger ver mi actualización – Bozho

1

Pero en lugar de una clave primaria compuesta en la tabla C, me gustaría tener una ID generada y una restricción única en los campos a_id y b_id.

Normalmente, la clave principal del JoinTable se compone de la combinación de ambas claves externas. Al menos, esto es lo que JPA generaría. Pero si no utiliza el proveedor JPA para generar el modelo y si la base de datos puede generar el PK (usando una columna IDENTITY, un disparador, etc.), entonces debería poder usar la tabla C para su asociación ManyToMany (sin tener que introducir una entidad extra y transformar la relación en dos OneToMany). ¿Lo intentaste realmente?

5

Deberías hacer esto así. Pero se puede aplicar solo para la lista (no para conjuntos)

@Entity 
@TableGenerator(name="ids_generator", table="IDS") 
public class Passport { 
    ... 

    @ManyToMany(cascade = CascadeType.ALL) 
    @JoinTable(name="PASSPORT_VISASTAMP") 
    @CollectionId(
     columns = @Column(name="COLLECTION_ID"), 
     [email protected](type="long"), 
     generator = "ids_generator" 
    ) 
    private Collection<Stamp> visaStamp = new ArrayList(); 
    ... 
} 
Cuestiones relacionadas