복붙노트

[SPRING] HibernateException : 현재 스레드에 대해 트랜잭션 동기화 세션을 가져올 수 없습니다.

SPRING

HibernateException : 현재 스레드에 대해 트랜잭션 동기화 세션을 가져올 수 없습니다.

오류가 발생합니다.

Exception in thread "main" org.hibernate.HibernateException: 
Could not obtain transaction-synchronized Session for current thread

본관

ppService.deleteProductPart(cPartId, productId);

@Service ( 'productPartService')

@Override
public void deleteProductPart(int cPartId, int productId) {
    productPartDao.deleteProductPart(cPartId, productId);
}

@ 저장소 ( "productPartDAO")

@Override
    public void deleteProductPart(ProductPart productPart) {
        sessionFactory.getCurrentSession().delete(productPart);
    }


@Override
    public void deleteProductPart(int cPartId, int productId) {
        ProductPart productPart  = (ProductPart) sessionFactory.getCurrentSession()
                .createCriteria("ProductPart")
                .add(Restrictions.eq("part", cPartId))
                .add(Restrictions.eq("product", productId)).uniqueResult();
        deleteProductPart(productPart);
    }

그것을 고치는 방법?

최신 정보:

다음과 같이 메소드를 수정하면 :

@Override
@Transactional
public void deleteProductPart(int cPartId, int productId) {          
    System.out.println(sessionFactory.getCurrentSession());
}

다음을 반환합니다.

SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=[] updates=[] deletions=[] collectionCreations=[] collectionRemovals=[] collectionUpdates=[] collectionQueuedOps=[] unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])

하지만 @Transactional을 제거하면 예외가 발생합니다.

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread

@Transactional을 추가하여 작동 시키지만, 이제는 org.hibernate.MappingException을 얻고 있습니다. Unique entity : ProductPart .uniqueResult ()를 Criteria에 연결했지만. 그것을 고치는 방법?

해결법

  1. ==============================

    1.org.hibernate.MappingException : 알 수없는 엔티티 : ProductPart는 ProductPart라는 이름의 엔티티가 없음을 나타냅니다. 이 문제를 해결하는 한 가지 방법은 Class 객체를 createCriteria 메서드에 전달하는 것입니다.

    org.hibernate.MappingException : 알 수없는 엔티티 : ProductPart는 ProductPart라는 이름의 엔티티가 없음을 나타냅니다. 이 문제를 해결하는 한 가지 방법은 Class 객체를 createCriteria 메서드에 전달하는 것입니다.

    createCriteria(ProductPart.class)
    

    API에서 문자열과 클래스 사용의 차이점은 다음과 같습니다.

    Session.createCriteria (String)

    Create a new Criteria instance, for the given entity name. 
    

    Session.createCriteria (클래스)

    String을 전달하면 최대 절전 모드로 이름이 ProductPart로 선언 된 엔터티를 찾습니다.

  2. ==============================

    2.Hibernate 4.x와 Spring 4.x에서는 @Repository 뒤에 @Transactional을 추가하면이 동기화 예외가 해결됩니다.

    Hibernate 4.x와 Spring 4.x에서는 @Repository 뒤에 @Transactional을 추가하면이 동기화 예외가 해결됩니다.

  3. ==============================

    3.트랜잭션 지원 ( 또는 @EnableTransactionManagement)을 활성화하고 transactionManager를 선언해야하며 SessionFactory를 통해 작동해야합니다.

    트랜잭션 지원 ( 또는 @EnableTransactionManagement)을 활성화하고 transactionManager를 선언해야하며 SessionFactory를 통해 작동해야합니다.

    @Transactional을 @Repository에 추가해야합니다.

    @Repository에서 @Transactional을 사용하면 Spring은 저장소에 트랜잭션 지원을 적용 할 수 있습니다.

    귀하의 Student 클래스에는 @ javax.persistence. * 주석이 없습니다. @Entity, 해당 클래스의 매핑 구성이 XML을 통해 정의되었다고 가정합니다.

    참조

  4. ==============================

    4."org.hibernate.HibernateException : 현재 스레드에 대해 트랜잭션 동기화 세션을 가져올 수 없습니다"와 같은 오류가 발생했습니다.

    "org.hibernate.HibernateException : 현재 스레드에 대해 트랜잭션 동기화 세션을 가져올 수 없습니다"와 같은 오류가 발생했습니다.

    방금 내 Dao 구현에서 @Transactional (readOnly = false)을 사용하여 내 문제를 해결했습니다.

  5. from https://stackoverflow.com/questions/25933532/hibernateexception-could-not-obtain-transaction-synchronized-session-for-curren by cc-by-sa and MIT license