我现在用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这个异常.
有谁能帮我分析下这是什么原因,怎么来解决这个问题.