EclipseLink/JPA @OneToMany Backpointer Erreur de Cardinalité
Je suis en train de générer une unidirectionnel un-à-plusieurs mappage entre les deux entités JPA. Dans mon ChatRoom
classe, j'ai un Vector<User>
type d'objet qui représente User
s dans un ChatRoom
. Je suis en train de créer un un-à-plusieurs de cartographie, basé sur userId
(dans le User
classe). Voici mon exemple de code:
@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
}
Ici est la classe d'Utilisateur:
@Entity
public class User {
@Id
@GeneratedValue
private int userID;
private String username;
//Getter/Setter section
}
Quand j'essaie de générer les tables de ces entités dans Eclipse, j'obtiens 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 pour votre aide.
- link contient une réponse sur la façon de le faire à l'aide d'un @JoinTable, mais dans mon cas, j'obtiens l'erreur suivante:
Exception Description: The attribute [users] is not declared as type ValueHolderInterface, but its mapping uses indirection. Mapping: org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping[users]
Vous devez vous connecter pour publier un commentaire.
Quelques choses,
Votre mappedBy est fausse, un mappedBy pour un OneToMany doit être un ManyToOne. Je vous recommande d'ajouter le ManyToOne arrière, ou utiliser un @JoinTable, si vous ne le souhaitez pas, vous pouvez utiliser un @JoinColumn et pas de mappedBy.
Vecteur n'est pas valide dans l'APP, vous devez utiliser la Liste de, Ensemble ou une Carte. Vous pouvez toujours utiliser un Vecteur de votre classe d'implémentation. Si vous voulez vraiment utiliser Vecteur, puis EclipseLink soutiennent, mais vous devez faire de votre cartographie HÂTE.
Je suppose que C'est le problème de mappedBy annotation. Il doit être: "privé Tchat tchat;" dans votre classe d'utilisateur. Et dans mappedBy essayer d'écrire cette variable.
P. S. Si vous n'avez pas de lien de CharRoom dans votre relation, que vous pour s'assurer que la table de jointure. Ensuite, vous devez utiliser @JoinTable et d'annotation @OneToMany sans mappedBy.
Exception Description: The attribute [users] is not declared as type ValueHolderInterface, but its mapping uses indirection. Mapping: org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping[users]
@JoinColumn(name="user_id", referencedColumnName="chatroom_id")
et attribuer les noms de mes Identifiants. Le problème est que si vous n'utilisez pas unList
,Map
, ouSet
, alors vous devez spécifier votre propre indirection. Je ne suis pas sûr de la façon de le faire encore.