2010-11-11 20 views
2

J'ai une relation ManyToMany avec une clé composite entre un utilisateur et un groupe dans JPA EclipseLink. Ma mise en œuvre ressemble à ça:Problème avec ManyToMany et JPA EclipseLink

Classe utilisateur:

@Entity 
@Table(name="mbm_user") 
public class User extends CanAccessBook{ 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(nullable = false) 
private Long id; 

@OneToMany(mappedBy="user",cascade=CascadeType.PERSIST) 
private List<GroupMembership> groups = new ArrayList<GroupMembership>(); 

    /** 
    GETTER & SETTER 
    **/ 
} 

Classe Groupe:

@Entity 
@Table(name="mbm_group") 
public class Group extends CanAccessBook{ 

@Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
@Column(nullable = false) 
private Long id; 

@OneToMany(mappedBy="group", cascade=CascadeType.PERSIST) 
private List<GroupMembership> users = new ArrayList<GroupMembership>(); 

    /** 
    GETTER & SETTER 
    **/ 
} 

GroupMembership Classe:

@Entity 
@Table(name = "group_user") 
@IdClass(UserGroupPK.class) 
public class GroupMembership { 

@Id 
@ManyToOne 
@PrimaryKeyJoinColumn(name="USERID") 
private User user; 

@Id 
@ManyToOne 
@PrimaryKeyJoinColumn(name="GROUPID") 
private Group group; 

@Temporal(TemporalType.DATE) 
private Date joinedAt = new Date(); 

@Temporal(TemporalType.DATE) 
private Date validUntil; 

    /** 
    GETTER & SETTER 
    **/ 
} 

UserBookPK Classe:

public class UserBookPK{ 

@Id 
@Column(name="BOOKID") 
private Long book; 

@Id 
@Column(name="USERID") 
private Long user; 

public Long getBook() { 
    return book; 
} 

public void setBook(Long book) { 
    this.book = book; 
} 

public Long getUser() { 
    return user; 
} 

public void setUser(Long user) { 
    this.user = user; 
} 
} 

Mes tests JUnit sont rapport aucune erreur, mais si je teste sur mon Tomcat, que je reçois les erreurs suivantes

Exception [EclipseLink-59] (Eclipse persistance Services - 2.1.1.v20100817- r8050): org.eclipse.persistence.exceptions.DescriptorException Exception Description: La variable d'instance [groupId] n'est pas définie dans la classe de domaine [de.kapieren.mbm.server.model.GroupMembership] ou n'est pas accessible. Exception interne: java.lang.NoSuchFieldException: groupId Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping [groupId-- > group_user.GROUPID] Description: RelationalDescriptor (de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable (group_user)])

Exception [EclipseLink-59] (Eclipse persistance services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DescriptorException Exception description: L'instance variable [userId ] n'est pas défini dans la classe de domaine [de.kapieren.mbm.server.model.GroupMembership] ou n'est pas accessible. Exception interne: java.lang.NoSuchFieldException: userId Mapping: org.eclipse.persistence.mappings.DirectToFieldMapping [userId-- > group_user.USERID] Description: RelationalDescriptor (de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable (group_user)])

Exception [EclipseLink-0] (Eclipse Persistance services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DescriptorException Exception description: une erreur interne accédant l'objet clé primaire [202]. Exception interne: java.lang.NoSuchFieldException: groupId Description: RelationalDescriptor (de.kapieren.mbm.server.model.GroupMembership - > [DatabaseTable (group_user)])

Ce qui est qui ne va pas ici?

+0

Indice de départ: Que se passe-t-il lorsque vous changez Utilisateur utilisateur -> Utilisateur utilisateurId ... –

+0

Par souci d'exhaustivité, pouvez-vous également publier votre classe Group? –

+0

la classe de groupe est toujours là – LeonS

Répondre

0

J'ai essayé exactement le même code avec une machine Windows et cela fonctionne sans problème. Je pense que le problème est la JVM de MAC OS (je travaille avec Mac OS). Je dois donc continuer mon travail sur une machine virtuelle Windows. ce problème semble être documenté par EclipseLink (Exception 59). C'est très mauvais pour moi et je pense que ce sera ma dernière fois que j'ai essayé Java ....

1

Vous devriez utiliser @JoinColumn au lieu de @PrimaryKeyJoinColumn pour @ManyToOnes.

+0

Ne aide pas, toujours le même problème: (chose curieuse est que mes tests JUnit sont d'accord, mais avec Tomcat ces exceptions sont levées. – LeonS

0

Vous avez une classe UserBookPK, mais elle n'est référencée nulle part ailleurs.Je suppose que c'est censé être UserGroupPK? Dans ce cas, c'est faux. Les champs doivent être des instances de User et Group, pour un. Il devrait être Serializable (mais n'inclut pas un id de version, pour une raison quelconque).

Mieux encore, n'utilisez pas du tout @IdClass. C'est seulement là pour la rétrocompatibilité. Mettez une clé de substitution sur GroupMemberShip et utilisez-la pour relier tout ensemble. Ou si vous voulez vraiment la clé primaire composite, optez pour un @EmbeddedId. Puisque c'est juste la relation modélisée en tant qu'objet, cela a du sens.

Vous n'avez pas nécessairement besoin de mapper la classe intermédiaire non plus, il y a un @ManyToMany qui fonctionne parfois.