楼主  我想应该是你的配置文件中 one-to-many部分的inverse和cascade属性设置的问题在pmgr.getPerson(orderForm.getPersonId()));
这个method 你应该是在另一个session中例如sessionTwo创建了一个person的PO你在saveOrder的过程,使用当前的session sessionOne尝试保存order,由于级联操作触发保存personPO的操作,但是这个PO是从属于sessionTwo的,所以导致了这种异常建议:
将同一session注入到mgr和pmgr中,也就是确保你的order PO和person PO处于同一session中hope that help ^_^

解决方案 »

  1.   

    谢谢楼上的解答,我理解你的意思然后把action里的操作放到manager里就不报错了。变成在action里调用
    mgr.saveOrder(order, orderForm.getPersonId());在manager里save方法改成
    public void saveOrder(Order order, String personId) {
        order.setPerson(pdao.getPerson(Integer.valueOf(personId)));
        dao.saveOrder(order);
    }
    可是现在调用save方法还要加个参数,你提到关联设置有问题,我的是这样的Person.hbm.xml<set name="orders" inverse="true" cascade="all,delete-orphan">
        <key>
            <column name="person_id" not-null="true" />
        </key>
        <one-to-many class="com.myshop2.model.Order" />
    </set>Order.hbm.xml<many-to-one name="person" class="com.myshop2.model.Person" fetch="select" cascade="none">
        <column name="person_id" not-null="true" />
    </many-to-one>order的cascade="none"已经设置了,我应该怎么修改呢,谢谢。
      

  2.   

    唔,我理解的错误了楼主,你的hbm文件在我看来是没有问题  many-to-one的cascade=none也是正确的做法你的问题应该是把不同session里的PO关联到一起,然后对其中一个进行操作所保出的错误如果你的PO都是生存于同一个session,或者说,是从同一个DAO中load出来的话,我想就没有上面Exception了你的many2one和one2many设置没有问题,符合人和订单的关系,sorry for my mistake before
      

  3.   

    没有关系,我是不是应该把getPerson()也放进order manager,我看appfuse里这样写的:UserManager mgr = (UserManager) getBean("userManager");
    RoleManager roleMgr = (RoleManager) getBean("roleManager");
    String[] userRoles = request.getParameterValues("userRoles");for (int i = 0; userRoles != null &&  i < userRoles.length; i++) {
        String roleName = userRoles[i];
        user.addRole(roleMgr.getRole(roleName));
    }
    mgr.saveUser(user);
    他这样怎么就没问题呢
      

  4.   

    order.setPerson(pmgr.getPerson(orderForm.getPersonId()));
    这句话肯定会报错的,把这个处理放到service层中,然后用spring接管事务就ok了。
      

  5.   

    那请问是不是只能这样调用serviece层保存,
    mgr.saveOrder(order, orderForm.getPersonId());
    service层怎么写才能使用mgr.saveOrder(order)而不报错,是不是也要在order serviece层里加一个person dao和一个getPerson()方法,哪种写法才正确呢。
      

  6.   

    正确的开发是应该放入业务层的,只要给你的service来加上事务,一般就可以了。
    不一定非要再用一次dao和getPerson()。