autocommit和@Transactional以及与spring,jpa和hibernate的级联

时间:2009-12-02 18:09:18

标签: java hibernate spring orm jpa

我想要完成的是:

  1. 启用了自动提交,因此默认情况下所有查询都会被提交
  2. 如果方法上有@Transactional,它会覆盖自动提交并将所有查询包含在单个事务中,从而覆盖自动提交
  3. 如果有@Transactional方法调用其他@Transactional注释方法,则最外层注释应覆盖内部注释并创建更大的事务,因此注释也会覆盖彼此
  4. 我目前还在学习spring-orm,但是找不到关于这方面的文档,还没有针对此的测试项目。

    所以我的问题是:

    • 春天的交易的默认行为是什么?
    • 如果默认值与我的要求不同,有没有办法配置我想要的行为?
    • 或者是否有完全不同的交易最佳做法?

    - 编辑 -

    我有以下测试设置:

    @javax.persistence.Entity
    public class Entity {
      @Id
      @GeneratedValue
      private Integer id;
      private String name;
      public Integer getId() {
        return id;
      }
      public void setId(Integer id) {
        this.id = id;
      }
      public String getName() {
        return name;
      }
      public void setName(String name) {
        this.name = name;
      }
    }
    
    @Repository
    public class Dao {
      @PersistenceContext
      private EntityManager em;
      public void insert(Entity ent) {
        em.persist(ent);
      }
      @SuppressWarnings("unchecked")
      public List<Entity> selectAll() {
        List<Entity> ents = em.createQuery("select e from " + Entity.class.getName() + " e").getResultList();
        return ents;
      }
    }
    

    如果我这样,即使在hibernate中启用了自动提交,insert方法也不会做任何事情。我必须将@Transactional添加到插入或调用插入的方法才能使其工作...

    有没有办法让@Transactional完全可选?

1 个答案:

答案 0 :(得分:1)

  • 如果没有hibernate中的活动事务,您将无法进行查询
  • @Transactional具有propagation属性,用于标识调用新方法时的事务行为。默认值为REQUIRED,这是您想要的。 Here您可以找到该概念的图形表示。
  • 如果您使用aop设置事务方法,则可以省略@Transactional,如下所示:

    <aop:config>
        <aop:pointcut id="serviceMethods"
            expression="execution(* com.company.product.service..*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods" />
    </aop:config>
    
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" />
        </tx:attributes>
    </tx:advice>
    

    这使得service包事务中的所有公共方法。

另外,请随时阅读有关春季交易的整章。