У меня есть веб-приложение, использующее 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()));
}
Элементограничено зарегистрированным пользователем, но может быть создано несколько раз для каждого пользователя ..