2014-11-11 9 views
1

У меня возникли проблемы с добавлением пользователя в пользовательские коллекции объекта проекта, который я должен сохранить. В моей базе данных у проекта много пользователей, и у пользователя может быть много проектов.JPA Невозможно добавить объект пользователя к объекту проекта, который сохраняется.

@POST 
    @Consumes({"application/xml", "application/json"}) 
    public void create(Project entity) { 
     User user = em.find(User.class, 1); 
     Collection<User> users = new ArrayList<User>(); 
     users.add(user); 
     entity.setUserCollection(users); //This does not works 
     entity.setCreatedDate(new Date()); 
     entity.setStatus(1); 
     getEntityManager().persist(entity); //super.create(entity); 
    } 

Как это сделать?

Моя сущность проекта имеет это отображение

@ManyToMany(mappedBy = "projectCollection") 
    private Collection<User> userCollection; 

Хотя моя сущность Пользователь имеет эти

@JoinTable(name = "user_has_project", joinColumns = { 
    @JoinColumn(name = "User_idUser", referencedColumnName = "idUser")}, inverseJoinColumns = { 
    @JoinColumn(name = "Project_idProject", referencedColumnName = "idProject")}) 
    @ManyToMany 
    private Collection<Project> projectCollection; 
    @ManyToMany(mappedBy = "userCollection") 
    private Collection<Project> ProjectCollection; 

Моя структура БД как My DB structure

+0

Define "не работает". –

+0

Он не идет в базу данных, у меня есть таблица как пользовательский идентификатор пользователя user_has_project. Идентификатор проекта должен идти к нему. –

+1

То, что вы опубликовали, недостаточно для диагностики проблемы. Мы не знаем, как отображаются ваши объекты, и что делает 'super.create (entity)'. –

ответ

2

Ваше отображение не имеет никакого смысла.

Первое:

private Collection<Project> projectCollection; 
private Collection<Project> ProjectCollection; 

Почему у вас есть два различных ассоциаций от пользователя к проекту, каждый из которых назван почти таким же образом? Если у вас действительно есть две различные ассоциации (например, пользователь, владеющее проектов, и пользователь, участвующих в проектах), а затем выбрать значимые имена для этих двух ассоциаций, уважая Java именования, как

private Collection<Project> ownedProjects; 
private Collection<Project> involvedProjects; 

Во-вторых, обратите внимание на отображение:

@ManyToMany(mappedBy = "projectCollection") 
private Collection<User> userCollection; 

Это означает: «Я всего лишь обратная сторона Для того, чтобы знать, как отображается эта двунаправленная связь, посмотрите на User.projectCollection.».

Как указано, что касается JPA в двунаправленной связи, это сторона владельца. Сторона владельца - это сторона, которая НЕ имеет атрибута mappedBy. Итак, чтобы сохранить связь между Project и User, необходимо заполнить User.projectCollection.

Так что ваш код должен быть:

User user = em.find(User.class, 1); 
    Collection<User> users = new ArrayList<User>(); 
    users.add(user); 
    entity.setUserCollection(users); // useful to maintain coherence, but ignored by JPA 
    entity.setCreatedDate(new Date()); 
    entity.setStatus(1); 
    getEntityManager().persist(entity); 

    user.getProjectCollection().add(entity); // necessary to have the association persisted 
+0

Ваш ответ очень информативен. :) Я не могу понять, почему существуют две разные ассоциации от пользователя к проекту:/Может быть, плохой повторный факторинг. Это может быть причина? Я сомневаюсь, какой из них я должен удалить. Я новичок. Я пробовал приведенный выше код и теперь кажется, что он правильно подключается, когда я запрашиваю проекты пользователя, он показывает недавно добавленный проект. Но это не относится к дБ. Кажется, он остается только в баране. –

+0

также удалил ненужную ассоциацию, и теперь она работает! : D Большое спасибо! –

0

объявлений Насколько я знаю, вы не можете быть нанесены на карту на двух сторонах ManyToMany. Также управляющая сторона отношений должна поддерживать отношения. Таким образом добавьте и удалите части коллекции.

Попробуйте изменить это в объекте пользователя.

@JoinTable(name = "user_has_project", joinColumns = { 
@JoinColumn(name = "User_idUser", referencedColumnName = "idUser")}, inverseJoinColumns = { 
@JoinColumn(name = "Project_idProject", referencedColumnName = "idProject")}) 
@ManyToMany 
private Collection<Project> projectCollection; 
@ManyToMany(mappedBy = "userCollection") 
private Collection<Project> ProjectCollection; 

Слишком

@ManyToMany(mappedBy = "userCollection") 
private Collection<Project> projectCollection; 

И Entity Проект слишком

@JoinTable(name = "user_has_project", joinColumns = { 
@JoinColumn(name = "Project_idProject", referencedColumnName = "idProject") 
    }, inverseJoinColumns = { 
@JoinColumn(name = "User_idUser", referencedColumnName = "idUser")  
}) 
@ManyToMany 
private Collection<User> userCollection; 

См http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/ для полного примера

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