나는 Hibernate를 사용하는 웹 애플리케이션을 가지고 있는데, 일부 데이터를 유지하려고 시도하고 있지만 @Transactional 어노테이션을 사용 함에도 불구하고 트랜잭션 내에서 지속되지 않는다. 다음과 같이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() 메소드가 정상적인 방법의 또 다른 스프링 빈에서 호출되고, 그리고 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 [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected])
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 [email protected] [managed: 3, unused: 2, excluded: 0] (e.g. [email protected])
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
UPDATE
는 또한 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()));
}
빈이 로그인 한 사용자로 범위이지만, 또한 각 사용자에 대해 여러 번 생성 될 수있다 .. 또
예, 주석 주도형 구성 (프록시가 아닌 모드로 aspectJ 사용). 이전에 entityManager.flush()를 추가하려했습니다. 지속 호출 후 "트랜잭션 진행 중"오류가 발생했지만 제안 된 코드로 확인합니다. 감사합니다 - 어떻게 작동하는지 알려드립니다 – rhinds
좋습니다. 트랜잭션 동기화 관리자를 사용하여 확인했습니다. 확실히 트랜잭션이 없습니다. 그러나, 그것은 낯선 사람을 얻는다. 나는 entityManager.flush()를 추가하여 일찍 테스트했다. (트랜잭션 에러가 없다.) 플러시 콜을 제거하고 프로젝트를 정리했다./Eclipse에서 Eclipse를 다시 시작했다. 응용 프로그램에서 데이터를 커밋 할 관리 (DB를 증명할 수있는 행이 있음) -하지만 더 이상 기능을 다시 만들려면 시도가 실패하고 다른 것을 유지할 수 없습니다 (re-cleaning/restarting 재 시도 등). 트랜잭션이 때때로 시작되지만 항상 그런 것은 아니겠습니까? – rhinds
내가 할 수없는 전체 프로젝트를 살펴볼 때까지는 그렇지 않습니다. 하지만 aspectJ에 대해 언급했는데 대신 프록시 모드를 사용해보십시오. – Bozho