2015-07-20 110 views
0

我在更新多对多表时遇到了一个问题。保存工作正常,但不更新。更新时,它会删除旧记录,但新记录不会被插入。休眠ManytoMany @JoinTable更新问题

只是有关表的简要介绍:

父表 - MainTable

路表 - LK(LK具有FK_Type其是另一个查找)

多对多 - Test_Many

TEST_MANY表有三列:

1.FK_MAINID

2.FK_LK_ID

3.FK_LKTYPE

所有三列是TEST_MANY的PK。第二和第三列是来自LK表的PK列,第一列是主表中的PK列。

请在下面找到该代码。

实体:

@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

谢谢Brian和Dragan。

问题已解决。问题是收集lookups为空。所以在更新功能中:

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

首先按预期清除行。然后设置null将不会创建任何行。

谢谢大家的所有建议。