2011-11-17 19 views
21

Tengo una relación de muchos a muchos en mis beans Java. Cuando uso List para definir mis variables como:Hibernate ¿Hay muchas o muchas relaciones establecidas o listas?

@Entity 
@Table(name="ScD") 
public class Group extends Nameable { 

    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER) 
    @JoinColumn(name="b_fk") 
    private List<R> r; 
    //or 
    private Set<R> r; 

me sale ese error:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0' 
... 

cuando uso Set todo parece funcionar bien.

Quiero preguntar que cuando se utilizan relaciones de muchos a muchos cuál usar para el concepto lógico List o Set (debido a la lista puede haber duplicados y establecer pero ¿qué pasa con el rendimiento y otros problemas)?

Respuesta

52

Desde la perspectiva de bases de datos relacionales, este es un conjunto. Las bases de datos no conservan el orden y usar un List no tiene sentido, el orden en ellas no está especificado (a menos que se utilicen las llamadas colecciones indexadas).

El uso de un Set también tiene grandes implicaciones de rendimiento. Cuando se usa List, Hibernate usa la colección PersistentBag debajo de la cual tiene algunas características terribles. Es decir: si agrega una nueva relación, primero eliminará todas las existentes y luego las insertará + su nueva. Con Set solo inserta el nuevo registro.

Tercera cosa - no se puede tener múltiples List s en una entidad como se puede obtener infame No se pueden obtener simultáneamente múltiples bolsas excepción.

Consulte también:

+0

Además de la relación muchos a muchos (one-one, many-one, one-many) ¿debería usar 'Set' en lugar de' List' también para un buen patrón de diseño? – kamaci

+0

Sí, porque 'List' sugiere que los artículos están ordenados, lo que no es cierto. Lo sé, sé que tiene API un poco más fácil. –

+3

tanto votar aceptando como respuesta para obtener información detallada y buenos enlaces. – kamaci

3

¿Y el requisito de unicidad del conjunto? ¿No obliga esto a Hibernate a recuperar todos los objetos cada vez que se agrega uno a la colección para asegurarse de que uno recién agregado sea único? Una lista no tendría esta limitación.

+1

La lista también tiene esta limitación, porque hibernate necesita mantener el orden en las listas, por lo que también tiene que recuperar todos los elementos –

Cuestiones relacionadas