在事务内部进行Hibernate JPQL Update / Delete操作

时间:2013-11-21 07:59:00

标签: spring oracle hibernate jpa jpql

使用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。

问题:

  • 这是一个Hibernate错误吗?
  • 项目中是否存在一些配置错误(使用LocalContainerEntityManagerFactoryBean和JpaTransactionManager)?
  • 这样做是否意味着我们不能在一个事务中对具有InheritanceType.JOINED的实体使用JPQL UPDATE / DELETES?
  • 别的什么?

0 个答案:

没有答案