Reputation: 8745
Hello I am using developnig java web application and I am getting the next exception when I am trying to fetch data using hibernate
java.lang.ClassCastException: com.digitalticket.model.UserType_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
Here stacktrace
java.lang.ClassCastException: com.digitalticket.model.UserType_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.getProxy(JavassistLazyInitializer.java:147)
at org.hibernate.proxy.pojo.javassist.JavassistProxyFactory.getProxy(JavassistProxyFactory.java:75)
at org.hibernate.tuple.entity.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:771)
at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:4613)
at org.hibernate.event.internal.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:349)
at org.hibernate.event.internal.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:270)
at org.hibernate.event.internal.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:150)
at org.hibernate.internal.SessionImpl.fireLoad(SessionImpl.java:1070)
at org.hibernate.internal.SessionImpl.internalLoad(SessionImpl.java:989)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:716)
at org.hibernate.type.EntityType.resolve(EntityType.java:502)
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:170)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:144)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1114)
at org.hibernate.loader.Loader.processResultSet(Loader.java:972)
at org.hibernate.loader.Loader.doQuery(Loader.java:920)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:354)
at org.hibernate.loader.Loader.doList(Loader.java:2553)
at org.hibernate.loader.Loader.doList(Loader.java:2539)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2369)
at org.hibernate.loader.Loader.list(Loader.java:2364)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:126)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1682)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:380)
at com.digitalticket.model.DAO.fetchAll(DAO.java:204)
at com.digitalticket.controller.IndexController.handleRequestInternal(IndexController.java:22)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:154)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:50)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:844)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:280)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:254)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:136)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:341)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:238)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.wrapRun(WebAppServletContext.java:3363)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3333)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:120)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2220)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2146)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2124)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1564)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:254)
at weblogic.work.SelfTuningWorkManagerImpl$WorkAdapterImpl.run(SelfTuningWorkManagerImpl.java:550)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:295)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:254)
Here my code
public T fetchAll(tClass<T> className) {
Session s = sessionFactory.getCurrentSession();
s.beginTransaction();
try {
List<T> results = (List<T>) sessionFactory.getCurrentSession()
.createCriteria(className)
.list();
s.getTransaction().commit();
return results();
} catch (NullPointerException ex) {
return null;
}
catch (RuntimeException re) {
s.getTransaction().rollback();
throw re;
} finally {
}
}
Here is my objects
public class User implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = -2383716625869790753L;
private long userId;
private UserType userType;
private String email;
private String password;
private String name;
private String surname;
private String middlename;
private Set<Ticket> tickets = new HashSet<Ticket>(0);
private Set<Organization> organizations = new HashSet<Organization>(0);
public User() {
}
public User(long userId, String email, String password, String name,
String surname) {
this.userId = userId;
this.email = email;
this.password = password;
this.name = name;
this.surname = surname;
}
public User(long userId, UserType userType, String email, String password,
String name, String surname, String middlename,
Set<Ticket> tickets, Set<Organization> organizations) {
this.userId = userId;
this.userType = userType;
this.email = email;
this.password = password;
this.name = name;
this.surname = surname;
this.middlename = middlename;
this.tickets = tickets;
this.organizations = organizations;
}
public long getUserId() {
return this.userId;
}
public void setUserId(long userId) {
this.userId = userId;
}
public UserType getUserType() {
return this.userType;
}
public void setUserType(UserType userType) {
this.userType = userType;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return this.password;
}
public void setPassword(String password) {
this.password = password;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return this.surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
public String getMiddlename() {
return this.middlename;
}
public void setMiddlename(String middlename) {
this.middlename = middlename;
}
public Set<Ticket> getTickets() {
return this.tickets;
}
public void setTickets(Set<Ticket> tickets) {
this.tickets = tickets;
}
public Set<Organization> getOrganizations() {
return this.organizations;
}
public void setOrganizations(Set<Organization> organizations) {
this.organizations = organizations;
}
}
public class UserType implements java.io.Serializable {
/**
*
*/
private static final long serialVersionUID = -206438165274679246L;
private long userTypeCode;
private String userTypeName;
private Set<User> users = new HashSet<User>(0);
public UserType() {
}
public UserType(long userTypeCode, String userTypeName) {
this.userTypeCode = userTypeCode;
this.userTypeName = userTypeName;
}
public UserType(long userTypeCode, String userTypeName, Set<User> users) {
this.userTypeCode = userTypeCode;
this.userTypeName = userTypeName;
this.users = users;
}
public long getUserTypeCode() {
return this.userTypeCode;
}
public void setUserTypeCode(long userTypeCode) {
this.userTypeCode = userTypeCode;
}
public String getUserTypeName() {
return this.userTypeName;
}
public void setUserTypeName(String userTypeName) {
this.userTypeName = userTypeName;
}
public Set<User> getUsers() {
return this.users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
here is mappings
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Mar 16, 2014 10:31:53 AM by Hibernate Tools 4.0.0 -->
<hibernate-mapping>
<class name="com.digitalticket.model.User" table=""USER"">
<id name="userId" type="long">
<column name="USER_ID" precision="10" scale="0" />
<generator class="assigned" />
</id>
<many-to-one class="com.digitalticket.model.UserType"
fetch="select" name="userType">
<column name="USER_TYPE" precision="10" scale="0" />
</many-to-one>
<property generated="never" lazy="false" name="email" type="string">
<column length="20" name="EMAIL" not-null="true" unique="true" />
</property>
<property generated="never" lazy="false" name="password"
type="string">
<column length="32" name="PASSWORD" not-null="true" />
</property>
<property generated="never" lazy="false" name="name" type="string">
<column length="64" name="NAME" not-null="true" />
</property>
<property generated="never" lazy="false" name="surname" type="string">
<column length="64" name="SURNAME" not-null="true" />
</property>
<property generated="never" lazy="false" name="middlename"
type="string">
<column length="64" name="MIDDLENAME" />
</property>
<set fetch="select" inverse="true" lazy="true" name="tickets"
sort="unsorted" table="TICKET">
<key>
<column name="USER" precision="10" scale="0" />
</key>
<one-to-many class="com.digitalticket.model.Ticket" />
</set>
<set fetch="select" lazy="true" name="organizations" sort="unsorted"
table="AUDITOR">
<key>
<column name="USER" not-null="true" precision="9" scale="0" />
</key>
<many-to-many entity-name="com.digitalticket.model.Organization"
unique="false">
<column name="ORGANIZATION" not-null="true" precision="10"
scale="0" />
</many-to-many>
</set>
</class>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<!-- Generated Mar 16, 2014 10:31:53 AM by Hibernate Tools 4.0.0 -->
<hibernate-mapping>
<class name="com.digitalticket.model.UserType" table="USER_TYPE">
<id name="userTypeCode" type="long">
<column name="USER_TYPE_CODE" precision="10" scale="0" />
<generator class="assigned" />
</id>
<property name="userTypeName" type="string">
<column name="USER_TYPE_NAME" length="40" not-null="true" unique="true" />
</property>
<set name="users" table="USER" inverse="true" lazy="true" fetch="select">
<key>
<column name="USER_TYPE" precision="10" scale="0" />
</key>
<one-to-many class="com.digitalticket.model.User" />
</set>
</class>
</hibernate-mapping>
I am using Oracle Weblogic 12c server
Upvotes: 36
Views: 47333
Reputation: 1
If you are deploying your hibernate based application on the weblogic server or similar, you are going to have an earlier version of javassist jar available inside the modules folder of the server. This would cause the conflict talked about in the earlier answers where you may end up in having more than one jars in the classpath.
specifically for weblogic add following in your weblogic-application.xml
add package-name javaassist.* to ensure that latest is picked up.
<?xml version="1.0" encoding="UTF-8"?>
<wls:weblogic-application
xmlns:wls="http://www.bea.com/ns/weblogic/weblogic-application"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/javaee_5.xsd http://www.bea.com/ns/weblogic/weblogic-application http://www.bea.com/ns/weblogic/weblogic-application/1.0/weblogic-application.xsd">
<wls:ejb>
<wls:start-mdbs-with-application>false
</wls:start-mdbs-with-application>
</wls:ejb>
<wls:prefer-application-packages>
<wls:package-name>antlr.*</wls:package-name>
<wls:package-name>org.apache.commons.*</wls:package-name>
<wls:package-name>org.apache.xmlbeans.*</wls:package-name>
<wls:package-name>org.springframework.*</wls:package-name>
<wls:package-name>org.hibernate.*</wls:package-name>
<wls:package-name>org.joda.*</wls:package-name>
<wls:package-name>javax.persistence.*</wls:package-name>
<wls:package-name>com.google.*</wls:package-name>
<wls:package-name>com.ibm.icu.*</wls:package-name>
<wls:package-name>org.apache.axiom.*</wls:package-name>
<wls:package-name>javassist.*</wls:package-name>
</wls:prefer-application-packages>
</wls:weblogic-application>
Upvotes: 0
Reputation: 21
Resolved issue for weblogic based spring-hibernate-jpa application. The class cast exception occurs because of conflicting jars of web logic server and javassist jar. Add the javassist-3.18.0-ga.jar or higher version into your class path and then add below lines of code into your weblogic-application.xml file and it should resolve your issue.
<wls:prefer-application-packages>
<wls:package-name>javassist.*</wls:package-name>
</wls:prefer-application-packages>
Upvotes: 2
Reputation:
I had a similar issue with javassist. I use the following dependencies in pom.xml file -
<org.hibernate.version>4.2.15.Final</org.hibernate.version>
<org.pentaho.di>6.0.1.0-386</org.pentaho.di>
<dependency>
<groupId>pentaho-kettle</groupId>
<artifactId>kettle-core</artifactId>
<version>${org.pentaho.di}</version>
<exclusions>
<exclusion>
<artifactId>xercesImpl</artifactId>
<groupId>xerces</groupId>
</exclusion>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>javassist</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>${org.hibernate.version}</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>ehcache-core</artifactId>
<groupId>net.sf.ehcache</groupId>
</exclusion>
</exclusions>
</dependency>
+- org.hibernate:hibernate-ehcache:jar:4.2.15.Final:compile
[INFO] | +- org.jboss.logging:jboss-logging:jar:3.1.0.GA:compile
[INFO] | \- org.hibernate:hibernate-core:jar:4.2.15.Final:compile
[INFO] | +- antlr:antlr:jar:2.7.7:compile
[INFO] | +- (org.jboss.logging:jboss-logging:jar:3.1.0.GA:compile - omitted for duplicate)
[INFO] | +- (dom4j:dom4j:jar:1.6.1:compile - omitted for duplicate)
[INFO] | +- org.javassist:javassist:jar:3.18.1-GA:compile
Hibernate contains the appropriate version, hence removing it from pentaho-core I found the dependency tree using-
mvn dependency:tree -Dverbose >> C:\pipeout2.txt
Upvotes: 0
Reputation: 79
I had the same issue when using hibernate + titles. Solved by excluding javassist from tiles-extras:
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>3.0.5</version>
<exclusions>
<exclusion>
<groupId>jboss</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
Upvotes: 0
Reputation: 2594
I had similar issue on JBoss EAP 7.1.3 (EAP 6.0.1) for hibernate 4.2.x. Its because JBoss modules already contains javassist lib.
I solved it by creating jboss-deployment-structure.xml in WEB-INF directory with such content:
<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
<deployment>
<exclusions>
<module name="org.javassist"/>
</exclusions>
<local-last value="true" />
</deployment>
</jboss-deployment-structure>
Upvotes: 5
Reputation: 11542
I use with hibernate 4.3.5.Final and have similar problem with javassist, the problem is that javassist is missing, and you can get the latest from the Maven repositorty.
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.1-GA</version>
</dependency>
In later editions it is fixed again
With this all works in my case,
Upvotes: 27
Reputation: 299
I have been using 4.2.8-Final version of hibernate and was having this issue and went through the below answers/suggestions earlier. Here is the sequence of events I made - To get rid of the issue with 4.2.8-Final, was using "parent classes last" class loader approach in Websphere. Recently when the project grew in size (by having more hibernate related jar flavors), started to get the same issue.
Finally excluded the "javassist" from hibernate
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
<exclusions>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
and added
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.1-GA</version>
Even this didn't resolve the problem completely (still I had to use 'parent last' class loader approach with hibernate to get rid of the issue.
Finally I downgraded hibernate version from 4.2.8-Final to 4.2.7-Final and the issue is solved (I need not change my class loader preference in websphere admin console as parent last anymore)
Not exactly sure what change in 4.2.8 Hibernate is causing this issue. Curious to know.
Upvotes: 3
Reputation: 1995
While only partially related to your question, I wanted to post this somewhere to help out anyone who may come across this problem when using SpringMVC, Hibernate, and Apache Tiles.
I was getting this exception when I had org.apache.tiles tiles-extras listed as a dependency. Tiles-extras and hibernate-core have different versions of javassist listed as a dependency. By adding the following to my pom.xml file, I was able to fix the error.
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>3.0.5</version>
<exclusions>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>jboss</groupId>
</exclusion>
</exclusions>
</dependency>
Upvotes: 12
Reputation: 316
I had the same problem with Spring Data JPA. I confirm it comes from javassit conflict. The solution is :
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>javassist</artifactId>
<groupId>org.javassist</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.18.2-GA</version>
<scope>compile</scope>
</dependency>
Upvotes: 0
Reputation: 143
Like anquegi has already commented. You have a lib conflict. Back hibernate to 4.2.7.Final will not solve your lib conflict.
Run mvn dependency:tree -Dverbose
and look to javassist different versions. In my case, I need to exclude javassist from Hibernate dependencies.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
<exclusions>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
<exclusions>
<exclusion>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</exclusion>
</exclusions>
</dependency>
This may help others in to future.
Upvotes: 13
Reputation: 175
It looks that Weblogic itself contains javaassist older, than your application has. It can be fixed in application descriptor, weblogic.xml or weblogic-application.xml. Just add
<prefer-application-packages>
<package-name>javassist</package-name>
</prefer-application-packages>
into root config element.
Btw, you can check such conflicts using Weblogic Classloader Analysis Tool - it can be accessed on /wls-cat context path of your server.
Upvotes: 11
Reputation: 3322
In my case problem was that there were two javassist
libraries in classpath. One from org.hibernate
and other from org.apache.struts.xwork
. Solved by removing latter.
Upvotes: 19
Reputation: 8745
Fixed by changing dependency in my pom.xml to older version 4.3.4.Final Error was in 4.3.4.Final version changed to 4.2.7.Final
Do not think it is the best solution but I have not found any other.
Upvotes: 8