Spring + Hibernate - 当事务真正提交时?

时间:2017-02-21 17:20:35

标签: spring hibernate

我面临一个单一的问题......

我需要更新实体,但我不知道它何时真正更新

我的方法是

@Override
    @Transactional(isolation = Isolation.SERIALIZABLE)
    public void lightOn(int idInterruttore) {

        Interruttore interruttore = dao.findById(idInterruttore);

            String inputPin = interruttore.getInputPin();
            String pinName = interruttore.getRelePin();
            GpioController gpio = interruttore.getGpio();
            GpioPinDigitalOutput rele = gpio.provisionDigitalOutputPin(RaspiPin.getPinByName(pinName));

            try {
                DateTime date = new DateTime();
                Date now = date.toDate();
                    int i = 1;
                    while (getInput(inputPin, gpio) != 1) {
                        if(i > 1){
                        logger.debug(String.format("Try n %s", i));
                        }
                        pushButton(rele);
                        Thread.sleep(1000);
                        i++;
                    }
                    dao.updateInterruttore(idInterruttore, now, true);

            } catch (GpioPinExistsException | InterruptedException gpe) {
                logger.error("GPIO già esistente", gpe);
            } finally {
                gpio.unprovisionPin(rele);
            }

        logger.debug(String.format("After the update status should be true and it's %s",
                interruttore.isStato()));
    }

updateInterruttore是(我使用此表单确保在更新后调用提交...我有锁定选项,因为可以对此方法进行多次调用,但只有第一次必须更新

@Override
    public void updateInterruttore(int idInterruttore, Date dateTime, boolean stato) {

        Session session = getSession();
        Transaction tx = session.beginTransaction();
        String update = "update Interruttore i set i.dateTime = :dateTime, i.stato = :stato where idInterruttore = :idInterruttore";
        session.createQuery(update).setTimestamp("dateTime", dateTime).setBoolean("stato", stato)
                .setInteger("idInterruttore", idInterruttore).setLockOptions(LockOptions.UPGRADE).executeUpdate();
        tx.commit();
            }

}

嗯......当我更新日志时,我说:

After the update status should be true and it's false

只有在我第一次调用方法时才会发生这种情况,第二次interruttore.isStato正确为真。

为什么会这样?

2 个答案:

答案 0 :(得分:0)

这是因为您使用update语句直接更新数据库。在这种情况下,Hibernate不会自动更新已加载的实体。如果在调用dao.updateInterruttore后重新加载实体,则应获取更新的数据。

答案 1 :(得分:0)

两个注释:

1)您正在使用查询来应用更新。在这种情况下,Hibernate将不会更新会话中的实体。除非您更新实体本身并调用session.save(interruttore),否则实体将不会更新。 (但更新显示在数据库中。)此外,我不明白你为什么不更新实体并通过session.save()保存它。

2)您使用@Transactional注释服务方法。 (假设是Spring注释)如果你使用JTA,你的tx.commit()将没有任何效果。但是一旦方法完成,您的事务就会被提交。 (如果方法抛出异常,则回滚)如果你没有使用JTA,那么就像你正在做的那样摆脱@Transactional并管理DAO方法中的事务。但那被认为是不好的做法。