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
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
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 –