2011-11-02 22 views
24

necesito para crear una tabla de unión en mi base de datos utilizando JPA anotaciones por lo que el resultado será el siguiente:¿Cómo crear una tabla de unión con anotaciones JPA?

enter image description here

Hasta ahora Sólo se aplicó 2 entidades:

@Entity 
@Table(name="USERS", schema="ADMIN") 
public class User implements Serializable { 

    private static final long serialVersionUID = -1244856316278032177L; 
    @Id 
    @Column(nullable = false) 
    private String userid; 

    @Column(nullable = false) 
    private String password; 

    public String getUserid() { 
     return userid; 
    } 

    public void setUserid(String userid) { 
     this.userid = userid; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

} 

@Entity 
@Table(name="GROUPS", schema="ADMIN") 
public class Group implements Serializable { 

    private static final long serialVersionUID = -7274308564659753174L; 
    @Id 
    @Column(nullable = false) 
    private String groupid; 

    public String getGroupid() { 
     return groupid; 
    } 
    public void setGroupid(String groupid) { 
     this.groupid = groupid; 
    } 
} 

debo crear otra entidad llamada USER_GROUP o sólo puedo añadir algunas anotaciones, por lo t La tabla de unión se creará automáticamente cuando ejecute create tables from entities (ORM)?

¿Cómo debo anotar mis entidades para alcanzar el mismo que en la imagen?

+2

¿Qué es la cardinalidad entre el Grupo y las entidades de usuario? ¿Es @OneToMany, para que cada grupo tenga 0 .. * usuarios? ¿O es ManyToMany? – jFrenetic

+1

Es un @OneToMany, de manera que cada grupo tiene 0 .. * usuarios, ya que said.A usuario debe pertenecer a uno y sólo un grupo, pero un grupo puede tener muchos (0 .. *) usuarios. – sfrj

Respuesta

28

que definitivamente no debe crear user_group entidad ya que es más la representación de base de datos subyacente que la orientada a objetos.

Se puede lograr la unión de tablas mediante la definición de algo como:

@Entity 
@Table(name="USERS", schema="ADMIN") 
public class User implements Serializable { 
//... 

@ManyToOne 
@JoinTable(name="USER_GROUP") 
Group group; 

@Entity 
@Table(name="GROUPS", schema="ADMIN") 
public class Group implements Serializable { 
//... 

@OneToMany(mappedBy="group") 
Set<User> users; 

Editar: Si desea establecer explícitamente los nombres de las columnas que podría utilizar elementos como @JoinColumn muestran a continuación:

@ManyToOne 
@JoinTable(name="USER_GROUP", 
    joinColumns = @JoinColumn(name = "userid", 
           referencedColumnName = "userid"), 
    inverseJoinColumns = @JoinColumn(name = "groupid", 
           referencedColumnName = "groupid")) 
Group group; 
+0

Quizás quiso decir @ManyToMany? http://download.oracle.com/javaee/5/api/javax/persistence/ManyToMany.html – Jonathan

+1

@ Jonathan no quiero decir '@ OneToMany' y' @ ManyToOne' como se muestra en el ejemplo. ¿Por qué? –

+0

@PedroKowalski Eso funcionó perfectamente. Muchas gracias :) – sfrj

6

que habría que poner en práctica esta w Ay:

@Entity 
@Table(name="GROUPS", schema="ADMIN") 
public class Group implements Serializable { 
    @OneToMany 
    @JoinTable(name = "USER_GROUP", 
      joinColumns = @JoinColumn(name = "groupid"), 
      inverseJoinColumns = @JoinColumn(name = "userid")) 
    private List<User> users; 
} 

solución sugerida por @PedroKowalski debería funcionar también, pero entonces usted tendrá que mantener una referencia a Grupo entidad en su usuario entidad que no siempre es posible.

+0

Bueno, realmente depende de si quieres tener una relación unidireccional o bidireccional. Supuse que era bidireccional, ya que parecía razonable que el Usuario supiera a qué Grupo pertenece y que Group sepa qué usuarios hay dentro de él. Por supuesto, si se requiere una relación unidireccional, esta solución también está bien. –

4

para tener las mismas anotaciones al igual que en el diagrama se puede hacer esto en su clase User:

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "USER_GROUP", 
      joinColumns = { @JoinColumn(name = "userid") }, 
      inverseJoinColumns = { @JoinColumn(name = "groupid") }) 
private List<Group> grups; 

en su clase de grupo

@ManyToMany(fetch = FetchType.LAZY) 
@JoinTable(name = "USER_GROUP", 
      joinColumns = { @JoinColumn(name = "groupid") }, 
      inverseJoinColumns = { @JoinColumn(name = "userid") }) 
private List<User> users; 
+0

¿Por qué muchos a muchos? Un usuario debe pertenecer a uno y solo a un grupo? Pero un grupo puede tener más de un usuario. Sé que suena raro, pero tiene que ser de esa manera. No es como Facebook donde un usuario puede estar en muchos grupos, el grupo significa el rol de ese usuario en el sistema. Y un usuario solo puede tener un rol. – sfrj

+0

mea culpa, pensé que el objetivo era tener muchas relaciones de muchos – user902383

+0

Pregunta: ¿y si ya tengo esta tabla adicional? El JoinTable no sobrescribirá el existente, ¿verdad? – TheWandererr

1

Me pregunto cuál es el punto de crear ¿Unirse a la tabla de esta manera, teniendo en cuenta que no podemos acceder directamente para las consultas? APP no permite hacer consultas directamente a la tabla de unión, por lo que si el usuario quiere hacer una operación en USER_GROUP, tiene que ctear una consulta de unión normal entre usuarios y grupos; debido a esto, la tabla de unión USER_GROUP es inútil.

+0

Angel, ese es el objetivo de JPA. En este caso, no tiene que escribir la consulta, ya que todo se representa como un objeto. Supongamos que tiene una entidad USUARIO y una entidad CURSO. Un usuario puede tener múltiples cursos y un curso se puede asignar a múltiples usuarios. (De la relación Muchos a Muchos, ¿no?) Por lo tanto, desea enumerar los cursos de un usuario específico que se define como una variable (probablemente Lista) en la Entidad usuaria. En este caso, solo busca al usuario y puede llamar al getter() de la lista, que le devolverá sus cursos. Puede ver que se está utilizando la tabla de unión. –

Cuestiones relacionadas