Hibernate删除主从表的问题

我现在用SSH框架做个小项目.现在遇到这样的问题,现在有五张表,一张人员表(users),一张文件表(files),一张文件操作类型表(fileOperations),一张文件夹表(folder)一张中间表(user_file_operation),中间表有三个字段(userId,fileId,operationId),这三个字段都为为外键,userId,fileId,operationId分别为三张表的主键.因为是多表关联,在pojo中所以我引申了一个类,类名为BarSnafu,这个类包含其他两个类的字段,分别为(private Users user;private fileOperations fileOPeration;)并都get和set方法,
我的file类包含有BarSnafuSet集合.
cascade="save-update">

        <composite-element
            class="com.linkey.fms.common.model.pojo.BarSnafu">

            <many-to-one cascade="save-update" name="fileOperation"
                column="operationId"
                class="com.linkey.fms.common.model.pojo.Fileoperations" />

            <many-to-one cascade="save-update" name="user"
                column="userId"
                class="com.linkey.fms.common.model.pojo.Users" />
        </composite-element>
    </set>

其他User类和FileOperation未配Set集合,因为只有新建文件时才会选择用户和操作类型,而新建用户和操作类型是不用选择文件的,也就是说这种关系是单向的.

现在我要增加文件,因为一个文件包含多个操作类型和用户,所以我是这样做的,Files tFile=new Files();
tFile.setFileName("11");tFile.setFileTitle("11");tFile.setFolder(folder);Set set=new HashSet();

Users user1=new User();FileOperations operation1=new FileOperations();BarSnafu bar1=new BarSnafu();
bar1.setUser(user1);bar2.setFileOperation(operation1);set.add(bar1);

依次类推,我在set集合里加了bar2,bar3等,然后在tFile.setBarSnafuSet(set);然后调用Hibernate的Save()方法,此时报了

a different object with the same identifier value was already associated with the session异常,这个问题已经解决,我是调用Hibernate中的merge()方法.
然后我在页面显示了某一文件夹的所有文件(只是显示该文件夹的文件),我选了该文件夹下的部分文件,点击删除,用的是Hibernate中的deleteAll(list)方法,而且我在Action已经把所选择的文件放在一个List里面.按理说我只是要删除我所选择的文件,但是Hibernate却做了一件我怎么也搞不明白的事,它先删除我所选择的文件,然后找到该文件所在的文件夹,然后再删除该文件夹下的所有文件,然后再删除该文件夹.我写了一个测试类,代码如下
[color=red]
public class SysFileServiceTest extends BaseTest{

private FileFrameService fileService;

private FolderFrameService folderService;

private FileOperationFrameService fileOperationService;

private SysUserService sysUserService;
      @Before
      public void setUp() {
 fileService = (FileFrameService) factory.getBean("fileService");
 folderService = (FolderFrameService) factory.getBean("folderService");
      fileOperationService = (FileOperationFrameService) factory.getBean("fileOperationService");
 sysUserService = (SysUserService) factory.getBean("sysUserService");
}
      @Test
public void deleteFile()
{

    TSysFile tFile1=fileService.findFileByFileId("11111");
    TSysFile tFile2=fileService.findFileByFileId("22222");
    List<TSysFile> list=new ArrayList<TSysFile>();
    list.add(tFile1);
    list.add(tFile2);
    boolean flag=fileService.deleteFileBatch(list);
    System.out.println(flag);
}

}
[/color]

测试类没有通过,报的确是a different object with the same identifier value was already associated with the session这个异常.

有谁能帮我分析下这是什么原因,怎么来解决这个问题.

2个回答

比较典型的级联删除问题
推荐楼主使用回调删

这里有个有例子
[url]
http://aidiyuxin.iteye.com/blog/224850[/url]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问