Hibernate @Transactional не запускает транзакцию - PullRequest
1 голос
/ 27 марта 2012

У меня есть веб-приложение, использующее Hibernate, и я пытаюсь сохранить некоторые данные, но оно не сохраняется в Транзакции, несмотря на использование аннотации @Transactional.

Мой класс обслуживания выглядит следующим образом:

@Service("profileService")
public class ProfileService {
    private EntityManager entityManager;

    @Autowired
    private AccountService accountService;

    @Autowired
    private ProfileDAOImpl profileDao;

    @PersistenceContext
    public void setEntityManager(EntityManager em) {
        this.entityManager = em;
    }

    @Transactional
    public void addConnectionToAccount(SocialConnection sc) {
        entityManager.persist(sc);
    }

}

Метод addConnectionToAccount () вызывается из другого bean-компонента Spring в обычном методе, и класс ProfileService в настоящее время внедряется туда:

public class HibernateConnectionRepository implements ConnectionRepository {

    @Inject
    private ProfileService profileService;

    @Override
    @Transactional
    public void addConnection(SocialConnection sc) {
        try {
            profileService.addConnectionToAccount(accountId, sc);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Я попытался поместить @Transactionalаннотация к вызывающему методу в тщетной надежде на то, что он может что-то изменить, но ничего.

Ранее я сталкивался с такими проблемами, как это было, потому что сохраняемый объект не удовлетворяет ограничениям таблицы (таким как столбцы, не допускающие значения NULL)как ноль) или потому, что метод вызывается из того же класса, и вызывающий метод не является Транзакционным, но ни один из них не имеет место здесь ..

Есть идеи?просто молча происходит сбой, журналы выглядят следующим образом:

2012-03-26 22:25:04,702 [http-bio-8085-exec-9] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace com.mchange.v2.resourcepool.BasicResourcePool@1bc25c8 [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@e5b006)
2012-03-26 22:25:04,710 [http-bio-8085-exec-9] DEBUG org.hibernate.SQL - select SEQ_COUNT from SEQUENCE where SEQ_NAME = 'PO_SEQ' for update
2012-03-26 22:25:04,711 [http-bio-8085-exec-9] DEBUG org.hibernate.SQL - update SEQUENCE set SEQ_COUNT = ? where SEQ_COUNT = ? and SEQ_NAME = 'PO_SEQ'
2012-03-26 22:25:04,723 [http-bio-8085-exec-9] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace com.mchange.v2.resourcepool.BasicResourcePool@1bc25c8 [managed: 3, unused: 2, excluded: 0] (e.g. com.mchange.v2.c3p0.impl.NewPooledConnection@e5b006)
2012-03-26 22:25:04,723 [http-bio-8085-exec-9] DEBUG org.hibernate.event.internal.AbstractSaveEventListener - Generated identifier: 2200, using strategy: org.hibernate.id.MultipleHiLoPerTableGenerator

ОБНОВЛЕНИЕ

Также хотелось бы отметить, что компонент HibernateConnectionRepository не аннотирован и фактическибудучи сконфигурированным в классе @Configuration (если это имеет какое-то значение? не очень много использовали классы @Configuration).

Метод для создания компонента состоит в следующем:

@Bean
@Scope(value = "request", proxyMode = ScopedProxyMode.INTERFACES)
public ConnectionRepository connectionRepository() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication == null) {
        throw new IllegalStateException("Unable to get a ConnectionRepository: no user signed in");
    }
    ApplicationUser user = (ApplicationUser) authentication.getPrincipal();
    return usersConnectionRepository().createConnectionRepository(String.valueOf(user.getAccountId()));
}

Элементограничено зарегистрированным пользователем, но может быть создано несколько раз для каждого пользователя ..

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Еще кое-что посмотреть (хотя у вас есть хорошее начало с ограничениями и вызовами из одного и того же компонента):

  • <tx:annotation-driven /> присутствует в вашем XML-файле
  • точно ли транзакция не запущена? Проверьте с TransactionSynchronizationManager.isActualTransactionActive(). Это может быть другая (не связанная с транзакцией проблема)
0 голосов
/ 29 марта 2012

Ошибка была связана с тем, что аспекты не запускаются должным образом.

В связи с этой проблемой: Пусть eclipse использует maven для компиляции / переплетения моего кода , что происходит с использованием новых версий Eclipse иM2E.

Чистая Eclipse не соткала аспекты, поэтому транзакционные аннотации не были переплетены.Это работало с перебоями, потому что, когда я делал обычную чистую установку maven (командная строка и т. Д.), То выполнялось плетение (очистка Eclipse, а затем снятие ткачества, так что если я чистую установку maven, то повторное построение затменияне работает).

Я исправил это, добавив конструктор AspectJ в мой проект в Eclipse, и теперь, когда я запускаю clean / build автоматически, он правильно плетет его.

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