考慮看看到Hibernate源代碼後,我寫了下面的類:
import org.hibernate.SessionFactory;
import org.hibernate.engine.EntityKey;
import org.hibernate.event.EventSource;
import org.hibernate.persister.entity.EntityPersister;
/**
* @author aldian
*
*/
public class HibernateDebug {
private static SessionFactory sessionFactory;
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
HibernateDebug.sessionFactory = sessionFactory;
}
public static String checkUniqueness(Object entity, Long id) {
try {
org.hibernate.classic.Session currentSession = sessionFactory.getCurrentSession();
if (currentSession instanceof EventSource) {
EventSource eventSource = (EventSource) currentSession;
eventSource.getPersistenceContext().unproxyAndReassociate(entity);
EntityPersister persister = eventSource.getEntityPersister(entity.getClass().getName(), entity);
EntityKey key = new EntityKey(id, persister, eventSource.getEntityMode());
eventSource.getPersistenceContext().checkUniqueness(key, entity);
return "OK";
}
} catch (Exception e) {
return e.getMessage();
}
return "NOT OK";
}
}
請注意,您必須配置任何初始化你的應用程序(例如彈簧),以便它注入了一個SessionFactory在相應的bean 。
我打電話從Eclipse中Expressions
視圖此方法:例如我使用用表達
com.mycompany.hibernate.HibernateDebug.checkUniqueness(entity,entity.getId())
在大多數情況下它打印OK
或關於消息的評估一步步進展該對象已經關聯但沒有找到條目。但是當它更改爲NonUniqueObjectException
的文本時,我確切知道在哪裏挖掘以找出數據庫的罪魁禍首。
希望這會幫助其他人與古怪的Hibernate異常鬥爭..