有两个表,一对一的关系,有DTOclass TableA{……}
class TableB{
     @OneToOne
     private TableA tableA;
     ……
}我测试插入数据时public class TestCode{
@Autowired
private ITableBService tbservice;//service层,需要的参数和返回类型都是DTO
@Test
public void testSave1(){
TableBdto tbDTO=new TableBdto();
TableA ta=new TableA();
//ta.set,即使ID是数据库中已有的,这一段都能运行
tbDTO.setTableA(ta);//虽然没写出get&set,但你懂的
tbservice.save(tbDTO);//这个可以成功插入
  }
@Test
public void testSave2(){
TableBdto tbDTO=new TableBdto();
TableADTO taDTO=tbserivce.findByID(1);//从数据库中找已有的数据
TableA ta=new TableA();
TableADTO.dtoToEntity(taDTO,ta);//DTO里写了一个把数据从DTO传到实体entity中的方法
tbDTO.setTableA(ta);
tbservice.save(tbDTO);//这个插入失败
}}异常信息我就看懂一个same id……谁知道这是什么问题呢?
如果需要异常信息,我明天再把它抄下来

解决方案 »

  1.   

    TableADTO.dtoToEntity(taDTO,ta);不知这个方法做了什么ta有问题
      

  2.   

    TableADTO taDTO=tbserivce.findByID(1);//从数据库中找已有的数据
    TableA ta=new TableA();
    TableADTO.dtoToEntity(taDTO,ta);//DTO里写了一个把数据从DTO传到实体entity中的方法
    tbDTO.setTableA(ta);
    tbservice.save(tbDTO);//这个插入失败
    TableADTO taDTO=tbserivce.findByID(1),从hibernate的session中拿到了id为1的TableA 对象(假设为ta_old);TableADTO.dtoToEntity(taDTO,ta);又将前面这个对象的所有属性拷贝到新的TableA 对象(ta)中;
    在tbservice.save(tbDTO);时,session中包含了两个id为1的TableA对象,即ta_old和ta,所以会报more than one object with the same id has been existed。就是说session中有多余一个相同id的对象,这对于hibernate来说是不允许的。
    改造一下tbserivce.findByID(1),直接返回TableA类型对象,后续直接赋值给TableB对象,就没有问题了。要不就改造bserivce.findByID(1)方法,做一下session的flush和detach,将DTO对象从session剥离出来。