code:
 dataService.save(entity);  // PO, "inser t values(,,)" occured.
 logger.debug("save entity: {}", entity);
 entity.setProcessInstanceId(processInstanceId);
 dataService.saveOrUpdate(entity); // No "update t set ..."其中,dataService实现了HibernateOperations(继承HibernateTemplate)
求指导,求扫盲。

解决方案 »

  1.   

    code:
     dataService.save(entity);  // VO--->PO--->DO?, "inser t values(,,)" occured.
     logger.debug("save entity: {}", entity);
     entity.setProcessInstanceId(processInstanceId);
     dataService.update(entity); // No "update t set ..."
     dataService.flush();// fixed! but not expected. please help me.
    其中,dataService实现了HibernateOperations(继承HibernateTemplate)
    给分,结贴。求来人。
      

  2.   

    多谢。
    请问,如何才能查看"事务状态"?
    我个人认为表与实体的对应是不存在问题的,因为调用
    dataService.flush()方法后,能打印出符合预期的语句:
    Hibernate: update be.oa_leave set PROCESS_INSTANCE_ID=? where ID=?
      

  3.   

    dataService.flush();没有这句,你的对象还是瞬时状态,加上就从瞬时到持久状态了。
      

  4.   

    是的,语句输出只是表明数据库命中,与事务提交的确没什么关系。
    不过当前确定事务已提交了。
    测试数据:
    (mysql> select * from oa_leave;
    +----+---------------------+---------+---------------------+---------------------+------------+----------------------------+-------
    --------------+---------------------+---------------------+
    | ID | PROCESS_INSTANCE_ID | USER_ID | START_TIME          | END_TIME            | LEAVE_TYPE | REASON                     | APPLY_
    TIME          | REALITY_START_TIME  | REALITY_END_TIME    |
    +----+---------------------+---------+---------------------+---------------------+------------+----------------------------+-------
    --------------+---------------------+---------------------+
    |  1 | NULL                | admin   | 2013-09-06 08:30:00 | 2013-09-06 17:30:00 | 事假       | 测试Activiti流程           | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    |  2 | NULL                | admin   | 2013-09-05 08:30:10 | 2013-09-05 17:30:00 | 事假       | 测试Activiti Engine        | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    |  3 | NULL                | admin   | 2013-09-05 18:06:50 | 2013-09-05 18:06:50 | 事假       | 测试请假                   | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    |  4 | NULL                | admin   | 2013-09-05 18:27:30 | 2013-09-05 18:27:30 | 事假       | 测试                       | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    |  5 | NULL                | admin   | 2013-09-05 18:41:19 | 2013-09-05 18:41:19 | 事假       | 测试                       | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    |  6 | NULL                | admin   | 2013-09-05 18:43:48 | 2013-09-05 18:43:48 | 事假       | 测试--entity流程数据不同步 | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    |  7 | NULL                | admin   | 2013-09-05 19:08:09 | 2013-09-05 19:08:09 | 事假       | 测试                       | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    |  8 | NULL                | admin   | 2013-09-06 08:40:24 | 2013-09-06 08:40:25 | 调休       | 测试工作流引擎             | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    |  9 | NULL                | admin   | 2013-09-06 09:08:02 | 2013-09-06 09:08:02 | 事假       | 测试:
    数据不同步           | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    | 10 | NULL                | admin   | 2013-09-06 09:38:50 | 2013-09-06 09:38:50 | 事假       | 测试                       | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    | 11 | NULL                | admin   | 2013-09-06 10:07:26 | 2013-09-06 10:07:26 | 事假       | 测试                       | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    | 12 | 2205                | admin   | 2013-09-06 11:21:49 | 2013-09-06 11:21:49 | 事假       | 测试                       | 2013-0
    9-06 11:21:56 | 2013-09-06 11:21:56 | 2013-09-06 11:21:56 |
    | 13 | 2305                | admin   | 2013-09-06 11:24:22 | 2013-09-06 11:24:09 | 事假       | 测试                       | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    | 14 | NULL                | admin   | 2013-09-06 11:27:20 | 2013-09-06 11:27:20 | 事假       | 测试                       | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    | 15 | 2505                | admin   | 2013-09-06 13:20:03 | 2013-09-06 17:30:00 | 事假       | 测试Activiti               | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    | 16 | 2512                | admin   | 2013-09-06 13:59:38 | 2013-09-06 13:59:27 | 事假       | 测试                       | 0000-0
    0-00 00:00:00 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
    +----+---------------------+---------+---------------------+---------------------+------------+----------------------------+-------
    --------------+---------------------+---------------------+)我个人认为流程是这样的:
     dataService.save(entity); 
    entity是前台传递过来的参数。
    由Transient--->Persistent,执行完后,
    1°若Sessionn关闭,持久化上下文失效。Persistent--->Detach。2°若Session未关闭,Hibernate在set方法调用时,应该自动脏检查才对。事务如下:
    [...]
    <prop key="connection.autocommit">true</prop>
    [...]
    这样配置不对,是吗?
      

  5.   

    在执行完 dataService.save(entity)之后,entity已经是一个Persistent Object了。
    只是Session关闭,会由Persistent Object--->Detached Object。
    我们可以用update(),lock()方法将其重新绑定到持久化上下文。变迁到Persistence Object.
    我个人认为,flush()只是强制将变化传播到数据库中。触发了事务提交操作。
    期望的场景是,Hibernate能自动将变化传播到数据库中,而不需要强制的手工刷新。