x71254469 2008-10-29 09:31
浏览 281
已采纳

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条回答 默认 最新

  • aidiyuxin 2008-10-29 14:56
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能