Reputation: 53
My configuration:
I'm using the basic configuration for Hibernate Envers, and I can see my audit tables being populated properly and also my "revinfo" table when insert/update/delete.
The problem is when I'm consulting some Entity/Revision, the error occurs.
My query:
@PersistenceContext(unitName = "pu")
protected EntityManager em;
@SuppressWarnings("rawtypes")
public List<Object[]> list(Class classe){
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(classe, false, true);
//Error occurs here:
Number revision = (Number) query
.getSingleResult();
System.out.println(revision);
List<Object[]> list = null;
return list;
}
private AuditReader getAuditReader() {
AuditReader reader = AuditReaderFactory.get(em);
return reader;
}
Error:
javax.ejb.EJBException: EJB Exception: : org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: org.hibernate.envers.DefaultRevisionEntity
at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:130)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:666)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4461)
at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:336)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:257)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:137)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1129)
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:1022)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:632)
at org.hibernate.type.EntityType.resolve(EntityType.java:424)
at org.hibernate.type.ComponentType.resolve(ComponentType.java:687)
at org.hibernate.loader.Loader.extractKeysFromResultSet(Loader.java:848)
at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:714)
at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
at org.hibernate.loader.Loader.doQuery(Loader.java:930)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.Loader.doList(Loader.java:2611)
at org.hibernate.loader.Loader.doList(Loader.java:2594)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2423)
at org.hibernate.loader.Loader.list(Loader.java:2418)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:501)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:371)
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:216)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1326)
at org.hibernate.internal.QueryImpl.list(QueryImpl.java:87)
Caused by: java.lang.ClassCastException: org.hibernate.envers.DefaultRevisionEntity_$$_javassist_153 cannot be cast to javassist.util.proxy.Proxy
at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:123)
... 129 more
at weblogic.ejb.container.internal.EJBRuntimeUtils.throwEJBException(EJBRuntimeUtils.java:88)
at weblogic.ejb.container.internal.BaseLocalObject.handleSystemException(BaseLocalObject.java:503)
at weblogic.ejb.container.internal.BaseLocalObject.handleSystemException(BaseLocalObject.java:446)
at weblogic.ejb.container.internal.BaseLocalObject.postInvoke1(BaseLocalObject.java:251)
at weblogic.ejb.container.internal.BaseLocalObject.__WL_postInvokeTxRetry(BaseLocalObject.java:204)
Truncated. see log file for complete stacktrace
Caused By: org.hibernate.HibernateException: HHH000142: Javassist Enhancement failed: org.hibernate.envers.DefaultRevisionEntity
at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:130)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:666)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4461)
at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:336)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:257)
Truncated. see log file for complete stacktrace
Caused By: java.lang.ClassCastException: org.hibernate.envers.DefaultRevisionEntity_$$_javassist_153 cannot be cast to javassist.util.proxy.Proxy
at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:123)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:666)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4461)
at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:336)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:257)
Truncated. see log file for complete stacktrace
Edit: . I can see in Weblogic CAT that there are several lib conflicts (app lib vs weblogic lib), including javassist.
So I added this to the weblogic-application.xml in my ear:
<prefer-application-packages>
<package-name>antlr.*</package-name>
<package-name>javassist.*</package-name>
</prefer-application-packages>
And now I'm getting a new different exception, but now this occours when Weblogic is starting:
weblogic.management.DeploymentException: java.lang.ClassCastException: org.jboss.weld.security.Principal$1127466021$Proxy$_$$_Weld$Proxy$ cannot be cast to javassist.util.proxy.ProxyObject
at weblogic.application.internal.BaseDeployment.throwAppException(BaseDeployment.java:123)
at weblogic.application.internal.BaseDeployment.activate(BaseDeployment.java:260)
at weblogic.application.internal.EarDeployment.activate(EarDeployment.java:61)
at weblogic.application.internal.DeploymentStateChecker.activate(DeploymentStateChecker.java:165)
at weblogic.deploy.internal.targetserver.AppContainerInvoker.activate(AppContainerInvoker.java:80)
Truncated. see log file for complete stacktrace
Caused By: java.lang.ClassCastException: org.jboss.weld.security.Principal$1127466021$Proxy$_$$_Weld$Proxy$ cannot be cast to javassist.util.proxy.ProxyObject
at org.jboss.weld.bean.proxy.ProxyFactory.create(ProxyFactory.java:249)
at org.jboss.weld.bean.builtin.ee.AbstractEEBean.<init>(AbstractEEBean.java:43)
at org.jboss.weld.bean.builtin.ee.PrincipalBean.<init>(PrincipalBean.java:52)
at org.jboss.weld.bootstrap.BeanDeployment.createBeans(BeanDeployment.java:193)
at org.jboss.weld.bootstrap.WeldBootstrap.deployBeans(WeldBootstrap.java:349)
Truncated. see log file for complete stacktrace
Any idead of what's happening?
Upvotes: 1
Views: 2600
Reputation: 21163
I would first make sure you have the proper version of Javassist on the classpath and that you don't happen to accidentally have multiple versions. I've seen similar issues in the past when I had conflicting versions.
For Hibernate 5.0.5, it would be javassist-3.18.1-GA.jar.
Here is an example of my audit history repository implementation that returns a list of entity revisions ordered by revision number for a given entity type and entity identifier as reference.
public class AuditHistoryRepository<T, ID extends Serializable> {
@PersistenceContext
private EntityManager entityManager;
private Class<T> entityClazz;
public List<T> getEntityRevisionsById(ID id) {
List<T> results = new ArrayList<>();
// read audit history
AuditReader reader = AuditReaderFactory.get(entityManager);
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(entityClazz, false, true)
.add(AuditEntity.id().eq(id))
.addOrder(AuditEntity.revisionNumber().asc());
// get results
for(Object row : query.getResultList()) {
if(row instanceof Object[]) {
Object[] array = (Object[])row;
T entity = (T) array[0];
results.add(entity);
}
}
return results;
}
}
Upvotes: 1