35

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="&quot;USER&quot;">
        <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

Sergey Pekar
  • 7,940
  • 7
  • 42
  • 51
  • 7
    You have two versions of Javassit on your classpath. These two versions are fighting. Check your classpath. – Boris the Spider Mar 18 '14 at 13:57
  • Is it possible to determine such collisions using eclipse or maven? I tried to find second javassist library in my classpath for 3 hours but I was not successful – Sergey Pekar Mar 18 '14 at 14:02
  • 1
    With maven you can [graph dependencies](http://stackoverflow.com/a/4084854/2071828) fairly easily. Don't know about eclipse. Note that the dependency isn't necessarily in your application - it could be provided by your webserver. – Boris the Spider Mar 18 '14 at 14:06
  • It doesn't have to two different versions of a class. This can happen even if you have a single version of a class. Specially, with an ear, chances are a single class might be loaded by multiple classloaders. – Bhesh Gurung Mar 18 '14 at 14:11

14 Answers14

26

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,

anquegi
  • 9,627
  • 3
  • 41
  • 60
19

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.

rand0m86
  • 2,802
  • 4
  • 24
  • 28
12

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.

Paulo Jr
  • 133
  • 2
  • 6
11

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.

10

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>
Peter Kirby
  • 1,755
  • 1
  • 16
  • 27
8

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.

Sergey Pekar
  • 7,940
  • 7
  • 42
  • 51
  • Thanks for the tip. I had the same issue with hibernate-release-4.3.8.Final and I solved it by downgrading to hibernate-release-4.0.0.Final. – prageeth Apr 30 '15 at 13:45
5

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>
rgrebski
  • 1,728
  • 17
  • 23
3

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.

Kisanagaram
  • 261
  • 2
  • 10
  • i did everything you have mentioned and have the same deployable environment.... still facing the same issue – Anas Oct 23 '18 at 19:00
2

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>
0

Check your return type T or List<T>of results

Wundwin Born
  • 3,279
  • 17
  • 35
0

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>
rasolog
  • 89
  • 9
0

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>
Weidong Fang
  • 11
  • 1
  • 1
0

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
0

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>