2014-09-19 6 views
9

Ich erhalte Fehler erhalten:HibernateException: Kann nicht transaktions synchronisiert Session für aktuellen Thread

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

Haupt

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); 
    } 

Wie es zu beheben?

UPDATE:

Wenn ich Methode wie folgt ändern:

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

Es gibt:

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

Aber wenn ich @Transactional entfernen endet mit Ausnahme up:

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

Ich bekomme es funktioniert durch Hinzufügen @Transactional, aber jetzt bekomme ich org.hibernate.MappingException: Unknown entity: ProductPart obwohl ich .uniqueResult() zu Criteria verkettet bin. Wie man es repariert?

+1

Versuch beginnen, die Transaktion mit 'session.getTransaction() beginnen (.),' Und sehen, ob das hilft? Auch die 'createCriteria' Methode gibt das' CriteriaImpl' zurück, so dass Sie nicht direkt in 'ProductPart' umgewandelt werden können. – Chaitanya

+0

@Chaitanya, Wenn ich das nicht so tun kann, was ist die einfachste Lösung? –

+0

RCola, ich bin nicht klar auf Ihren Kommentar, können Sie es ausarbeiten? – Chaitanya

Antwort

5

Der Fehler org.hibernate.MappingException: Unknown entity: ProductPart zeigt an, dass es keine Entität mit dem Namen ProductPart gibt. Eine Möglichkeit, dieses Problem zu beheben, ist die Class Objekt createCriteria Methode zu übergeben, wie:

createCriteria(ProductPart.class) 

Von API des Unterschied in der Verwendung von String und Klasse ist wie folgt:

Session.createCriteria(String)

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

Session.createCriteria(Class)

Wenn Sie einen String übergeben, sucht Hibernate nach einer Entität, deren Name als ProductPart deklariert ist.

4

Mit Hibernate 4.x und Spring 4.x, nur Fügen Sie @Transactional nach @Repository wird es diese Synchronization Ausnahme lösen.

0

Sie müssen die Transaktionsunterstützung (<tx:annotation-driven> oder @EnableTransactionManagement) aktivieren und den transactionManager deklarieren und er sollte über die SessionFactory funktionieren.

Sie müssen mit @Transactional in Ihrem @Repository Frühling ist in der Lage anwenden Transaktionsunterstützung in Ihrem Repository @Transactional in Ihr @Repository

hinzufügen.

Ihre Student-Klasse hat keine @javax.persistence.* Annotationen wie @Entity, ich nehme an, die Mapping-Konfiguration für diese Klasse wurde durch XML definiert.

Ref

+0

yees, ich habe die Annotation auf meiner Entity hinzugefügt und es hat funktioniert, ich habe die kommentiert, weil ich nicht ecache machen wollte und so bekam ich den Fehler – dzgeek

Verwandte Themen