autocommit и @Transactional и Cascading с весны, jpa и спящий - PullRequest
2 голосов
/ 02 декабря 2009

я хотел бы добиться следующего:

  1. автокоммит включен, поэтому по умолчанию все запросы фиксируются
  2. если в методе есть @Transactional, он переопределяет автокоммит и объединяет все запросы в одну транзакцию, переопределяя таким образом автокоммит
  3. если есть метод @Transactional, который вызывает другие аннотированные методы @Transactional, внешняя аннотация должна переопределять внутренние аннотации и создавать более крупные транзакции, таким образом, аннотации также переопределяют друг друга

В настоящее время я все еще изучаю spring-orm и не могу найти документацию по этому вопросу, и у меня пока нет тестового проекта.

Итак, мои вопросы:

  • Каково поведение транзакций по умолчанию весной?
  • Если значение по умолчанию отличается от моего требования, есть ли способ настроить желаемое поведение?
  • Или существует совершенно другая лучшая практика для транзакций?

- EDIT -

У меня есть следующие тестовые настройки:

@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 Ответ

1 голос
/ 03 декабря 2009
  • вы не можете иметь запросы без активной транзакции в спящем режиме
  • @Transactional имеет атрибут propagation, который определяет поведение транзакции при вызове новых методов. По умолчанию REQUIRED, это то, что вы хотите. Здесь вы можете найти графическое представление концепции.
  • вы можете не использовать @Transactional, если вы устанавливаете свои транзакционные методы с помощью aop, например:

    <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 транзакционными.

Кроме того, не стесняйтесь читать всю главу о весенних транзакциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...