2011-02-06 4 views
3

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

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

У вас есть идеи по решению этой проблемы? Спасибо за вашу помощь.

+0

[ссылка] (http://stackoverflow.com/questions/3515756/unidirectional-relationship-in-entity-bean-jpa) содержит ответ о том, как это сделать, используя @JoinTable, но в моем случае I получите следующую ошибку: «Исключение Описание: Атрибут [users] не объявлен как тип ValueHolderInterface, но его отображение использует косвенность. Mapping: org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping [users] ' –

ответ

6

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

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

Вектор недействителен в JPA, вы должны использовать List, Set или Map. Вы по-прежнему можете использовать Vector как свой класс реализации. Если вы действительно хотите использовать Vector, то EclipseLink будет поддерживать это, но вы должны сделать свое сопоставление EAGER.

1

Я думаю, это проблема аннотации mappedBy. Это должно быть: «Частный ChatRoom chatRoom»; в вашем пользовательском классе. И в mappedBy попробуйте написать эту переменную. P.S. Если у вас нет ссылки на CharRoom в ваших отношениях, вы наверняка присоединитесь к таблице. Затем вы должны использовать аннотацию @JoinTable и @OneToMany без mappedBy.

+0

Я пробовал подход @JoinTable, но теперь я получаю следующее исключение:« Исключение Описание: Атрибут [users] не объявлен как тип ValueHolderInterface, но его отображение использует косвенность. Сопоставление: org.eclipse.persistence.mappings.UnidirectionalOneToManyMapping [users] ' –

+0

Можете ли вы рассказать мне схему ваших отношений и кода, который вы пробовали? – damluar

+0

@damular, я использовал '@JoinColumn (name =" user_id ", referencedColumnName =" chatroom_id ")' и присвоил имена моим идентификаторам. Проблема в том, что если вы не используете 'List',' Map' или 'Set', тогда вы должны указать свою собственную косвенность. Я еще не знаю, как это сделать. –

Смежные вопросы