2013-03-29 3 views
1

, когда я хочу обновить список в jpa, таблицы остаются пустыми. никакой ошибки вообще. Присутствуют геттеры и сеттеры, которые просто не перечислены здесь.пустые таблицы при использовании многих-многих отношений в jpa

здесь мои занятия:

public class User implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue 
private int id; 


@ManyToMany 
private List<Course> courses; 

} 

public class Course implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue 
private int id; 

@ManyToMany(mappedBy="courses") 
private List<User> users; 
} 

А вот мой метод, который сохраняет объекты:

public boolean addCourse(User user, Course course){ 

    List<User> cas = new ArrayList<User>(); 
    cas.add(user); 

    EntityManager em = getEntityManager(); 
    try{ 
     em.getTransaction().begin(); 
     course.setUsers(cas); 
     em.getTransaction().commit(); 
     em.clear(); 
     return true; 
    } catch(Exception e) { 
     em.getTransaction().rollback(); 
     return false; 
    } 
} 
+1

Вы пытались использовать em.merge (курс); ? – user1697575

ответ

3

Код должен добавить @JoinTable аннотацию определить отношения многие ко многим на имущего лица , который в этом случае равен User, так как элемент mappedBy указывает на поле courses на User. Аннотация @JoinTable указывает joinColumns и inverseJoinColumns отношения, используемые в базе данных. Вы также должны указать элемент cascade в отношении @ManyToMany.

Вот пример. Обратите внимание, что я принял некоторые из ваших имен столбцов и что в базе данных существует таблица junctiona.

public class User implements Serializable { 

private static final long serialVersionUID = 1L; 

@Id 
@GeneratedValue 
private int id; 


@ManyToMany(cascade={CascadeType.ALL}) 
@JoinTable(name="USER_COURSE", joinColumns={@JoinColumn(name="USER_ID", referencedColumnName="USER_ID")}, 
inverseJoinColumns={@JoinColumn(name="COURSE_ID", referencedColumnName="COURSE_ID")}) 
private List<Course> courses; 

} 

В этом примере предполагается, что база данных содержит следующую таблицу

create table USER_COURSE(
    USER_ID integer, 
    COURSE_ID integer 
) 

Вы также можете посетить мой блог, где я покрывал эту тему в этом post.

+0

thx kevin, теперь таблица заполнена. но списки объектов в объектах по-прежнему пусты. мне нужно перестроить таблицы? – Benj

+0

@Benj Это может быть вызвано вызовом 'clear' в менеджере сущностей. Попробуйте удалить эту инструкцию. –

+0

нет, не работает. В следующий раз, когда я получу курс или пользователь, списки пустые. Но таблицы заполнены – Benj

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