我面临一个单一的问题......
我需要更新实体,但我不知道它何时真正更新
我的方法是
@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正确为真。
为什么会这样?
答案 0 :(得分:0)
这是因为您使用update语句直接更新数据库。在这种情况下,Hibernate不会自动更新已加载的实体。如果在调用dao.updateInterruttore
后重新加载实体,则应获取更新的数据。
答案 1 :(得分:0)
两个注释:
1)您正在使用查询来应用更新。在这种情况下,Hibernate将不会更新会话中的实体。除非您更新实体本身并调用session.save(interruttore)
,否则实体将不会更新。 (但更新显示在数据库中。)此外,我不明白你为什么不更新实体并通过session.save()
保存它。
2)您使用@Transactional
注释服务方法。 (假设是Spring注释)如果你使用JTA,你的tx.commit()将没有任何效果。但是一旦方法完成,您的事务就会被提交。 (如果方法抛出异常,则回滚)如果你没有使用JTA,那么就像你正在做的那样摆脱@Transactional并管理DAO方法中的事务。但那被认为是不好的做法。