pets
owners
types三张表,用Annotation建的。我现在想修改pets宠物表,
根据:
宠物名称
主人名称
类型名称
日期操作pets表,根据主人名称和类型名称修改想应的owner_id和type_id
SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
PetDTO p=(PetDTO)session.load(PetDTO.class, pdto.getId());
p.setPname(pdto.getPname());
p.setBirth_date(pdto.getBirth_date());
p.getTypes().setTname(pdto.getTypes().getTname());
p.getOwners().setOname(pdto.getOwners().getOname());
session.getTransaction().commit();
结果pets 表的名称和日期变了,owner_id 和type_id 没变。而owner_id对应的主人名变了(owners变了),
types表也一样。
原本是张三的宠物,我修改成李四的,应该是owner_id由张三的id 1变为李四的id 2,结果是owners表的张三变成了李四,也就是owners表的两个oname都是李四了。用sql 查询我会,我要用Hibernate写!!!Hibernate
owners
types三张表,用Annotation建的。我现在想修改pets宠物表,
根据:
宠物名称
主人名称
类型名称
日期操作pets表,根据主人名称和类型名称修改想应的owner_id和type_id
SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
PetDTO p=(PetDTO)session.load(PetDTO.class, pdto.getId());
p.setPname(pdto.getPname());
p.setBirth_date(pdto.getBirth_date());
p.getTypes().setTname(pdto.getTypes().getTname());
p.getOwners().setOname(pdto.getOwners().getOname());
session.getTransaction().commit();
结果pets 表的名称和日期变了,owner_id 和type_id 没变。而owner_id对应的主人名变了(owners变了),
types表也一样。
原本是张三的宠物,我修改成李四的,应该是owner_id由张三的id 1变为李四的id 2,结果是owners表的张三变成了李四,也就是owners表的两个oname都是李四了。用sql 查询我会,我要用Hibernate写!!!Hibernate
解决方案 »
- SSH框架配置事物,Action出错,费时费力不明白,求指导!!
- 刚学ibatis,遇到一个插入问题
- Tomcat5.5上的appfuse2.0工程转移到wesphere 5.01上,没思路啊!!
- 请问 @hibernate.composite-id 如何使用
- 大家介绍几本学习Tapestry中文书籍
- [求助]webservice调用出错
- 关于对字节流进行缓存的问题,就是怎么样将从I/0设备上获得的字节流进行缓存然后转化成字符输出???
- 能查看服务器运行的状态吗?
- QQ群:813562,欢迎加入一起学习交流jsp&struts技术!
- J2ee Tutorial 学习笔记(第一章)(原创)<不好意思没分给了>望大家鼓励我
- struts2 拦截器 定义错误不能指向自己定义的页面
- log4j配置问题,求教
SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
PetDTO p=(PetDTO)session.load(PetDTO.class, pdto.getId());
p.setPname(pdto.getPname());
p.setBirth_date(pdto.getBirth_date());
/**
* 你这里是想更换主人还是想修改主人的名字?这样写,是把主人的名字修改了,主人还是以前那个。如果主人
* 不变和类型不变,就不要写下面这两句。如果是修改关联的对象应该p.setTypes(pdto.getTypes())。
*/
p.getTypes().setTname(pdto.getTypes().getTname());
//这里也一样同上。
p.getOwners().setOname(pdto.getOwners().getOname());
session.getTransaction().commit();
org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: ph.dto.PetOwnerDTO
比如我修改pets表中第一条数据
1 云 2020-12-30 3 1(一只鸟叫云,是张三的宠物)修改将名字改为雨,类型改为猫,主人改为李四正常情况下应该是改pets表1 雨 2020-12-30 1 2而我结果是
pets表中pname和日期可以改,但type_id 和owner_id没变!
而type_id对应的类型鸟变成了猫(types表中有两个猫了,id为1 和 3)
owners 表中也一样! 我应该说清楚了吧?
这个还是算了吧,我已经解决了,就是想看看还有没有更好的方法。大家讨论一下
那肯定不会变啦,你看看你是怎么做的SessionFactory sessionFactory=new AnnotationConfiguration().configure().buildSessionFactory();
Session session=sessionFactory.getCurrentSession();
session.beginTransaction();
PetDTO p=(PetDTO)session.load(PetDTO.class, pdto.getId());
p.setPname(pdto.getPname());
p.setBirth_date(pdto.getBirth_date());
//你这样就是修改名字
//p.getTypes().setTname(pdto.getTypes().getTname());
//p.getOwners().setOname(pdto.getOwners().getOname());//应该这样,你将名字改为雨,类型改为猫,主人改为李四
//这里要先将猫查出来 再set
Type t = session.get();//查询猫
//查询主人李四
Owner ow = session.get();//查询主人
p.setTypes(t);
p.setOwners(ow);
session.update(p);
session.getTransaction().commit();