2012-04-06 15 views
5

Tengo dos clases de entidad 'Usuario' y 'Documento'. Cada usuario tiene una bandeja de entrada y una bandeja de salida que son, de hecho, dos listas y cada documento puede residir en múltiples bandeja de entrada y bandeja de salida de los usuarios. Aquí están mis clases:JPA: ¿Múltiples relaciones muchas-a-muchas entre dos entidades?

@Entity 
public class User { 

    @Id 
    private Long id; 

    @ManyToMany(mappedBy = "userinbox", cascade=CascadeType.ALL) 
    private List<Document> inbox = new ArrayList<Document>(); 
    @ManyToMany(mappedBy = "useroutbox", cascade=CascadeType.ALL) 
    private List<Document> outbox = new ArrayList<Document>(); 

} 

@Entity 
public class Document { 

    @Id 
    private Long id; 

    @ManyToMany(cascade=CascadeType.ALL) 
    private List<User> userinbox = new ArrayList<User>(); 
    @ManyToMany(cascade=CascadeType.ALL) 
    private List<User> useroutbox = new ArrayList<User>(); 

} 

Cuando ejecuto el Programm y tratar de asignar un documento a la bandeja de entrada de un usuario (y viceversa), me sale el siguiente error:

Error Code: 1364 

Call: INSERT INTO DOCUMENT_USER (userinbox_ID, inbox_ID) VALUES (?, ?) 
    bind => [2 parameters bound] 

Internal Exception: java.sql.SQLException: Field 'useroutbox_ID' doesn't have a default value 

Query: DataModifyQuery(name="userinbox" sql="INSERT INTO DOCUMENT_USER (userinbox_ID, inbox_ID) VALUES (?, ?)") 

La asociación generada la tabla se ve así:

DOCUMENT_USER 
useroutbox_ID | outbox_ID |userinbox_ID | inbox_ID 

¿Cómo puedo asignar valores predeterminados para una relación de tantos a muchos? ¿Sería mejor hacer dos tablas de asociación -> una para la relación de la bandeja de entrada, otra para la relación de la bandeja de salida? ¿Cómo podría lograr eso? Otras soluciones a este problema?

Cualquier ayuda muy apreciada, ¡muchas gracias de antemano!

+0

intente poner @ManyToMany (cascade = CascadeType.ALL) en su método getter no en su campo. –

+0

@tech_learner poner anotaciones en los campos está bien, ese no es el problema. –

Respuesta

12

Creo que la mejor opción es tener dos tablas separadas, una por relación. Porque en realidad tiene dos relaciones entre dos entidades diferentes, y no una relación con cuatro entidades diferentes.

Por lo tanto, debe agregar una anotación @JoinTable a cada uno de sus atributos en el lado Document ya que el lado User esas relaciones se asignan a una propiedad. Algo como lo siguiente:

@Entity 
public class Document { 

    @Id 
    private Long id; 

    @ManyToMany(cascade=CascadeType.ALL) 
    @JoinTable(name = "document_inbox", joinColumns = @JoinColumn(name = "userinbox_id"), 
       inverseJoinColumns = @JoinColumn(name = "inbox_id")) 
    private List<User> userinbox = new ArrayList<User>(); 
    @ManyToMany(cascade=CascadeType.ALL) 
    @JoinTable(name = "document_outbox", joinColumns = @JoinColumn(name = "useroutbox_id"), 
       inverseJoinColumns = @JoinColumn(name = "outbox_id")) 
    private List<User> useroutbox = new ArrayList<User>(); 

} 

Deje la otra entidad como está ahora. Espero que esto ayude.

+0

¡Genial! Muchas gracias por la respuesta rápida y útil: ahora funciona como un encanto :-) – salocinx

Cuestiones relacionadas