2015-07-20 2 views
0

У меня возникла проблема при обновлении таблицы много-много. Сохранить работает нормально, но не обновляется. При обновлении удаляются старые записи, но новые записи не вставляются.Hibernate ManytoMany Проблема с обновлением @JoinTable

Просто краткое введение о таблицах:

Родитель Таблица - MainTable

Lk Таблица - LK (LK имеет FK_Type, которая является другой поиск)

ManytoMany - Test_Many

TEST_MANY Таблица имеет три столбца:

1.FK_MAINID

2.FK_LK_ID

3.FK_LKTYPE

Все три колонки являются PK из TEST_MANY. Второй и третий столбцы представляют собой столбцы PK из таблицы LK, а первый столбец - столбец PK в главной таблице.

Пожалуйста, найдите код ниже.

Entity:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY) 
@JoinTable(name = "TEST_MANY", joinColumns = { 
    @JoinColumn(name = "FK_MAINID", referencedColumnName = "PK_MAINID", nullable = false, updatable = false)}, 
     inverseJoinColumns = { 
      @JoinColumn(name = "FK_LKID", referencedColumnName = "ID", nullable = false, updatable = false), 
      @JoinColumn(name = "FK_LKTYPE", referencedColumnName = "FK_TYPE", nullable = false, updatable = false)} 
) 
private List<LK> lookups; 

В DAO:

Session session = this.sessionFactory.getCurrentSession(); 
MainTable maintable = (MainTable) session.get(MainTable.class, id); 
maintable.getLookups().clear; 
maintable.setLookups(lookups)); 
session.merge(maintable); 

Любая помощь приветствуется. Заранее спасибо

+1

Является ли сеттер 'MainTable.setLookups()' повторно используемым ранее очищенным набором? Или он назначает параметр полю? – Brian

+0

Это не повторное использование ранее очищенной коллекции. Я назначаю для него новый объект коллекции. – Viswa

+0

Попробуйте повторно использовать коллекцию. Afaik - объект коллекции, предоставляемый Hibernate при загрузке объекта, - это некоторый 'PersistentCollection', который контролируется в сеансе. Поэтому я предлагаю добавить к нему все элементы вместо того, чтобы «выбросить его». – Brian

ответ

0

Спасибо Брайан и Драган.

Проблема разрешена. Проблема заключалась в сборе lookups, следующих как null. Таким образом, в функции обновления:

Session session = this.sessionFactory.getCurrentSession(); 
MainTable maintable = (MainTable) session.get(MainTable.class, id); 
maintable.getLookups().clear; 
maintable.setLookups(lookups)); 
session.merge(maintable); 

Сначала очистка строк, как ожидалось. Тогда установка null не создаст никаких строк.

Спасибо, ребята, за все ваши предложения.

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