2011-02-28 4 views
1

J'ai 3 tables: projet, l'utilisateur et son rôle. Maintenant, je voudrais avoir une table Project2User2Role avec la clé intégrée id_project, id_user ,.Créer ORMapping en utilisant les relations OneToMany pour 3 tables

Je l'ai essayé en utilisant les relations @OneToMany dans les trois entités, mais je pense que je ne peux pas construire comme ça.

Et j'ai aussi essayé de construire une classe d'entité Project2User2Role par moi-même, mais que je dois faire une IdClass sans les relations @ManyToOne.

Comment la solution pourrait ressembler?

Répondre

1

Le reference manual dit que vous pouvez intégrer une relation à l'intérieur d'un ID intégré:

Bien que pas pris en charge dans JPA, Hibernate vous permet de placer votre association directement dans le composant id intégré

Vous devez donc définir une entité Project2User2Role avec un ID de type Project2User2RoleId:

@Entity 
public class Project2User2Role { 
    @EmbeddedId 
    private Project2User2RoleId id; 

    public User getUser() { 
     return this.id.getUser(); 
    } 

    public Project getProject() { 
     return this.id.getProject(); 
    } 

    // ... 
} 

La classe Project2User2RoleId ressemblerait à ceci:

@Embeddable 
public class Project2User2RoleId { 
    @ManyToOne(optional = false) 
    @JoinColumn(name = "project_id") 
    private Project project; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "user_id") 
    private User user; 

    @ManyToOne(optional = false) 
    @JoinColumn(name = "role_id") 
    private Role role; 

    // constructor 
    // getters 
    // equals and hashCode 
} 
+0

Merci! J'ai utilisé votre solution.Utilisation d'un mappage bidirectionnel (entité utilisateur: @OneToMany (mappedBy = "user") Liste privée Project2User2Role;), j'obtiens maintenant l'exception suivante: Create: org.hibernate.AnnotationException: mappedBy référence une propriété d'entité cible inconnue: ... Project2User2Role.user dans ... project2User2Role – nogamawa

+0

non testé, mais essayez mappedBy = "id.user". Si la syntaxe est similaire à celle utilisée pour les propriétés dans HQL/JPQL, cela devrait fonctionner –

1

Pour JPA 1 vous ne pouvez pas utiliser des entités comme Id. De JPA 1 Spec (2.1.14)

La clé primaire (ou champ ou une propriété d'une clé primaire composite) doit être l'un des types suivants: tout Java type primitif; tout type de wrapper primitif ; java.lang.String; java.util.Date; java.sql.Date.

Si vous utilisez JPA 1 vous avez deux alternatives:

A. Vous devez créer un Project2User2Role avec un champ identifiant généré automatiquement et vous devez le définir comme identifiant de l'entité. Vous pouvez ensuite ajouter vos relations à Projet, Utilisateur et Rôle et spécifier les correspondances d'annotations correspondantes (ManyToOne). Exemple:

@Entity 
public class Project2User2Role { 

    private Long id; 

    private Project project; 

    private User user; 

    private Role role; 

    @Id 
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQPRUSROLID") 
    @SequenceGenerator(name="SEQPRUSROLID", sequenceName="SEQPRUSROLID", allocationSize=1) 
    public Long getId() { 
     return id; 
    } 

    @ManyToOne 
    public Project getProject() { 
     return project; 
    } 

    @ManyToOne 
    public User getUser() { 
     return user; 
    } 

    @ManyToOne 
    public Role getRole() { 
     return role; 
    } 
    //the setters 
} 

B. Vous pouvez créer votre classe d'entité et continuer à utiliser un identifiant composite mais comme JPA 1 Spec vous ne pouvez pas spécifier des entités comme un code d'identification, vous aurez besoin d'utiliser des colonnes de base pour cette exemple:

@Entity 
public class Project2User2Role { 

    @EmbeddedId 
    private Project2User2RoleId project2User2RoleId; 

    @ManyToOne 
    @JoinColumn(insertable=false, updatable = false) 
    private Project project; 
    @ManyToOne 
    @JoinColumn(insertable=false, updatable = false) 
    private User user; 
    @ManyToOne 
    @JoinColumn(insertable=false, updatable = false) 
    private Role role; 

    //getters/setters 
} 

    @Embeddable 
    class Project2User2RoleId { 
     private Long projectId; 
     private Long userId; 
     private Long roleId; 

    } 

Pour JPA 2:

C. Vous pouvez spécifier des entités comme id pour les exemples et la définition s'il vous plaît lire 2.4 de spécification JPA 2.0: http://jcp.org/aboutJava/communityprocess/final/jsr317/index.html 2.2.3 de Hibernate Documentation: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-identifier

Questions connexes