2011-02-06 6 views
3

J'essaie de générer un mappage unidirectionnel un-à-plusieurs entre deux entités JPA. Dans ma classe ChatRoom, j'ai un objet de type Vector<User> qui représente User s dans un ChatRoom. J'essaie de créer un mappage un-à-plusieurs, basé sur userId (dans la classe User). Voici mon exemple de code:EclipseLink/JPA @OneToMany Erreur de cardinalité dans le Backpointer

@Entity 
public class ChatRoom { 
    @Id 
    @GeneratedValue 
    private int chatRoomID; 

    @OneToMany(mappedBy="userID") 
    private Vector<User> users; 

    // A no-argument constructor is required for EclipseLink to instantiate the persistence object properly. 
    public ChatRoom() {} 

    // Getter/Setter section 
} 

Voici la classe User:

@Entity 
public class User { 
    @Id 
    @GeneratedValue 
    private int userID; 

    private String username; 

    // Getter/Setter section 
} 

Lorsque je tente de générer les tables de ces entités dans Eclipse, je reçois l'erreur suivante:

Internal Exception: javax.persistence.PersistenceException: Exception [EclipseLink-28018] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.EntityManagerSetupException 
Exception Description: Predeployment of PersistenceUnit [ChatJPA] failed. 
Internal Exception: Exception [EclipseLink-7244] (Eclipse Persistence Services - 2.0.2.v20100323-r6872): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: An incompatible mapping has been encountered between [class iosoa.entity.ChatRoom] and [class iosoa.entity.User]. This usually occurs when the cardinality of a mapping does not correspond with the cardinality of its backpointer. 
    at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126) 

Avez-vous des idées sur la façon de résoudre ce problème? Merci de votre aide.

+0

[link] (http://stackoverflow.com/questions/3515756/unidirectional-relationship-in-entity-bean-jpa) contient une réponse sur la façon de le faire en utilisant un @JoinTable, mais dans mon cas, je obtenez l'erreur suivante: 'Exception Description: L'attribut [users] n'est pas déclaré comme type ValueHolderInterface, mais son mappage utilise l'indirection. Mapping: org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping [users] ' –

Répondre

6

Quelques choses,

Votre mappedBy est erroné, un mappedBy pour une OneToMany doit être un ManyToOne. Je vous recommande de rajouter ManyToOne, ou d'utiliser @JoinTable, si vous ne le souhaitez pas, vous pouvez utiliser @JoinColumn et non mappedBy.

Le vecteur n'est pas valide dans JPA, vous devez utiliser la liste, l'ensemble ou la carte. Vous pouvez toujours utiliser un vecteur comme classe d'implémentation. Si vous voulez vraiment utiliser Vector, EclipseLink le supportera, mais vous devez faire votre mapping EAGER.

1

Je suppose que c'est un problème d'annotation mappedBy. Il devrait être: "ChatRoom chatRoom privé;" dans votre classe d'utilisateurs. Et dans mappedBy essayer d'écrire cette variable. P.S. Si vous n'avez pas de lien vers CharRoom dans votre relation, alors vous avez certainement une table de jointure. Ensuite, vous devez utiliser l'annotation @JoinTable et @OneToMany sans mappedBy.

+0

J'ai essayé l'approche @JoinTable, mais maintenant j'ai l'exception suivante:' Exception Description: L'attribut [users] n'est pas déclaré comme type ValueHolderInterface, mais son mapping utilise l'indirection. Mapping: org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping [utilisateurs] ' –

+0

pouvez-vous me dire le schéma de vos relations et le code que vous avez essayé? – damluar

+0

@damular, j'ai utilisé '@JoinColumn (name =" user_id ", referencedColumnName =" chatroom_id ")' et j'ai assigné les noms à mes identifiants. Le problème est que si vous n'utilisez pas 'List',' Map', ou 'Set', alors vous devez spécifier votre propre indirection. Je ne suis pas sûr de savoir comment le faire pour le moment. –