有两个表,一对一的关系,有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……谁知道这是什么问题呢?
如果需要异常信息,我明天再把它抄下来
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……谁知道这是什么问题呢?
如果需要异常信息,我明天再把它抄下来
解决方案 »
- 关于struts2中的checkbox和action 分不高但大家可以来讨论下
- java中的异常处理
- jsf2.0表单ID问题 急 急 急! ! !
- 关于股票接口方面的问题
- 求救。。高手coming in
- 在JSP中,如何禁用IE的 “前进”、“后退”功能?
- 在beans使用相对路径连接access总不成功.这是为什么
- 菜鸟的问题,请大家解释解释~~~~~
- 问一个关于登陆权限的问题
- jsp页面中的<%………%>内的代码得不到执行是怎么回事?
- 表单提交的问题
- Unexpected exception parsing XML document from ServletContext resource
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剥离出来。