EclipseLink / JPA @OneToMany Backininter Ошибка кардинальности - PullRequest
3 голосов
/ 06 февраля 2011

Я пытаюсь сгенерировать однонаправленное отображение «один ко многим» между двумя объектами JPA.В моем классе ChatRoom у меня есть объект типа Vector<User>, который представляет User s в ChatRoom.Я пытаюсь создать отображение «один ко многим» на основе userId (в классе User).Вот мой пример кода:

@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
}

Вот класс User:

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

    private String username;

    // Getter/Setter section
}

Когда я пытаюсь сгенерировать таблицы из этих сущностей в Eclipse, я получаю следующую ошибку:

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)

У вас есть идеи, как решить эту проблему?Спасибо за вашу помощь.

Ответы [ 2 ]

6 голосов
/ 07 февраля 2011

Несколько вещей,

Ваш mappedBy неправ, mappedBy для OneToMany должен быть ManyToOne. Я бы порекомендовал вам добавить ManyToOne обратно или использовать @JoinTable, если вы не хотите этого, то вы можете использовать @JoinColumn и не отображать карту.

Вектор недопустим в JPA, вы должны использовать Список, Набор или Карта. Вы все еще можете использовать Vector в качестве класса реализации. Если вы действительно хотите использовать Vector, то EclipseLink будет поддерживать это, но вы должны сделать отображение EAGER.

1 голос
/ 06 февраля 2011

Я думаю, это проблема аннотации mappedBy.Должно быть: "приватный ChatRoom chatRoom;"в вашем пользовательском классе.А в mappedBy попробуйте написать эту переменную.PS Если у вас нет ссылки на CharRoom в ваших отношениях, то у вас наверняка есть таблица присоединения.Тогда вы должны использовать аннотацию @JoinTable и @OneToMany без mappedBy.

...