EclipseLink/JPA - @OneToMany Backpointer Kardinalität Fehler
Ich versuche zu generieren, die eine unidirektionale eins-zu-viele-Zuordnung zwischen den beiden JPA-Entitäten. In meinem ChatRoom
Klasse, ich habe eine Vector<User>
Typ object, stellt User
s in einem ChatRoom
. Ich bin versuchen, um eine eins-zu-viele-Zuordnung, basierend auf userId
(in der User
Klasse). Hier ist mein Beispielcode:
@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
}
Hier ist die User-Klasse:
@Entity
public class User {
@Id
@GeneratedValue
private int userID;
private String username;
//Getter/Setter section
}
Wenn ich versuche, um die Tabellen zu erzeugen, die aus diesen entities in Eclipse bekomme ich die folgende Fehlermeldung:
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)
Haben Sie irgendwelche Ideen auf, wie dieses problem zu beheben? Vielen Dank für Ihre Hilfe.
- link enthält eine Antwort, wie Sie tun, also mit @JoinTable, aber in meinem Fall, bekomme ich die folgende Fehlermeldung:
Exception Description: The attribute [users] is not declared as type ValueHolderInterface, but its mapping uses indirection. Mapping: org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping[users]
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein paar Dinge,
Ihre mappedBy ist falsch, eine mappedBy-für einen OneToMany muss eine ManyToOne. Ich würde empfehlen, dass Sie hinzufügen die ManyToOne zurück, oder verwenden Sie eine @JoinTable, wenn Sie nicht wollen, dann könnten Sie eine @JoinColumn und kein mappedBy -.
Vektor ist nicht gültig in JPA verwenden, müssen Sie mit List, Set oder Map. Können Sie immer noch einen Vektor, wie Ihre Implementierung der Klasse. Wenn Sie wirklich wollen, Vektor, dann EclipseLink unterstützt, aber Sie müssen Ihre mapping GESPANNT.
Ich denke, Es ist problem der mappedBy Annotationen. Es sollte sein: "privater ChatRoom chatRoom;" in Ihrem Benutzer-Klasse. Und in mappedBy versuchen, zu schreiben dieser variable.
P. S. Wenn Sie keinen link zu CharRoom in Ihrer Beziehung, als Sie sicher zum Tisch. Dann sollten Sie die @JoinTable annotation und @OneToMany ohne 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")
zugeordnet und die Namen meiner IDs. Das problem ist, dass, wenn Sie nicht eineList
,Map
oderSet
, dann müssen Sie angeben, Ihre eigene Umleitung. Ich bin mir nicht sicher, wie dies zu tun ist noch.