Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I am getting error:

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

main

ppService.deleteProductPart(cPartId, productId);

@Service("productPartService")

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

@Repository("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);
    }

How to fix it?

UPDATE:

If I modify method like this:

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

It returns:

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

But if I remove @Transactional it ends up with exception:

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

I get it working by adding @Transactional, but now I am getting org.hibernate.MappingException: Unknown entity: ProductPart although I chained .uniqueResult() to Criteria. How to fix it?

like image 789
J.Olufsen Avatar asked Sep 19 '14 12:09

J.Olufsen


Video Answer


3 Answers

The error org.hibernate.MappingException: Unknown entity: ProductPart indicates there is no entity with name ProductPart. One way to fix this issue is to pass the Class object to createCriteria method as:

createCriteria(ProductPart.class)

From API the difference in using String and Class is as follows:

Session.createCriteria(String)

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

Session.createCriteria(Class)

Create a new Criteria instance, for the given entity class, or a superclass of an entity class, with the given alias.

If you pass a String then hibernate looks for an entity whose name is declared as ProductPart.

like image 134
Chaitanya Avatar answered Oct 26 '22 15:10

Chaitanya


With Hibernate 4.x and Spring 4.x, just Add @Transactional after @Repository it will solve this synchronizaion exception.

like image 26
Ayman Al-Absi Avatar answered Oct 26 '22 15:10

Ayman Al-Absi


You must enable the transaction support (<tx:annotation-driven> or @EnableTransactionManagement ) and declare the transactionManager and it should work through the SessionFactory.

You must add @Transactional into your @Repository

With @Transactional in your @Repository Spring is able to apply transactional support into your repository.

Your Student class has no the @javax.persistence.* annotations how @Entity, I am assuming the Mapping Configuration for that class has been defined through XML.

Ref

like image 1
Anand Rockzz Avatar answered Oct 26 '22 15:10

Anand Rockzz