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

解决方案 »

  1.   


    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();
      

  2.   

    还是有错:
    org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: ph.dto.PetOwnerDTO
      

  3.   

    楼主又见面了,我没太听懂,能否描述清楚一点我感觉我写得很详细啊。
    比如我修改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 表中也一样! 我应该说清楚了吧?
      

  4.   


    这个还是算了吧,我已经解决了,就是想看看还有没有更好的方法。大家讨论一下
    那肯定不会变啦,你看看你是怎么做的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();