使用Hibernate(4.2.7.SP1),Spring和Oracle。注意到当执行方法中的最后一行(JPQL UPDATE)时,但在@Transactional方法结束之前,dev的名称 A 被提交到数据库并且它是可见的(从另一个连接中选择) !
@Transactional
public void doInTransaction()
{
User user = userDao.findById("dev");
user.setName("A");
userDao.getEntityManager().createQuery("UPDATE User set name='B'").executeUpdate();
}
请注意,User是Person的子类,InheritanceType.JOINED,即涉及两个表, name 字段继承自Person。
在这里找到一些信息http://in.relation.to/Bloggers/MultitableBulkOperations解释了hibernate如何执行UPDATES和DELETES,而对于继承表,它创建了以 HT _ 为前缀的临时表。
执行一些调试,我看到的问题可以用两行表示:
update ILC_PERSON set name = 'A';
create global temporary table HT_ILC_PERSON_USER (id varchar2(255 char) not null) on commit delete rows;
-- bellow should execute the JPQL UPDATE User set name='B'
当执行创建临时表的DDL时,oracle会自动提交以前的DML。
问题: