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?
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.
With Hibernate 4.x and Spring 4.x, just Add @Transactional after @Repository it will solve this synchronizaion exception.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With