Results 1 to 5 of 5

Thread: interface org.hibernate.jdbc.ConnectionWrapper is not visible

  1. #1
    Join Date
    Feb 2008
    Posts
    15

    Default interface org.hibernate.jdbc.ConnectionWrapper is not visible

    In my application, I have exposed a dynamic MBean. I use JConsole to update the attribute of that bean. When setAttribute() is called, I update the object in the database. But the database update fails and I see the following stack trace in my application log file:
    Code:
    org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nest
    ed exception is java.lang.IllegalArgumentException: interface org.hibernate.jdbc.ConnectionWrapper is not visible from c
    lass loader
            at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:550)
            at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTra
    nsactionManager.java:377)
            at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(Transaction
    AspectSupport.java:263)
            at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
            at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
            at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
    
            at test.BeanDao$$EnhancerByCGLIB$$f06d99f4.updateConnectionProperty(<generated>)
            at test.DynamicMBean.setAttribute(DynamicMBean.java:257)
            at com.sun.jmx.mbeanserver.DynamicMetaDataImpl.setAttribute(DynamicMetaDataImpl.java:180)
            at com.sun.jmx.mbeanserver.MetaDataImpl.setAttribute(MetaDataImpl.java:206)
            at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.setAttribute(DefaultMBeanServerInterceptor.java:737)
            at com.sun.jmx.mbeanserver.JmxMBeanServer.setAttribute(JmxMBeanServer.java:722)
            at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1433)
            at javax.management.remote.rmi.RMIConnectionImpl.access$100(RMIConnectionImpl.java:81)
            at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1247)
            at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1343)
            at javax.management.remote.rmi.RMIConnectionImpl.setAttribute(RMIConnectionImpl.java:681)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:585)
            at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:294)
            at sun.rmi.transport.Transport$1.run(Transport.java:153)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
            at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
            at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
            at java.lang.Thread.run(Thread.java:595)
    Caused by: java.lang.IllegalArgumentException: interface org.hibernate.jdbc.ConnectionWrapper is not visible from class
    loader
            at java.lang.reflect.Proxy.getProxyClass(Proxy.java:353)
            at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:581)
            at org.hibernate.jdbc.BorrowedConnectionProxy.generateProxy(BorrowedConnectionProxy.java:67)
            at org.hibernate.jdbc.ConnectionManager.borrowConnection(ConnectionManager.java:163)
            at org.hibernate.jdbc.JDBCContext.borrowConnection(JDBCContext.java:111)
            at org.hibernate.impl.SessionImpl.connection(SessionImpl.java:359)
            at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:463)

    My code is as follows:
    In MyDynamicMBean.java

    Code:
    public void setAttribute(Attribute attribute) {
            String name = attribute.getName();
    	  Object value = attribute.getValue();        
              beanDao.updateConnectionProperty(bean, name, value);
    	}
    In BeanDao.java
    Code:
    	@Transactional(propagation=Propagation.REQUIRED)
    	public void updateConnectionProperty(MyBean bean, String name, Object value) {
    		bean.setConnectionProperty(name, (String)value);
    		Session s = sessionFactory.openSession();
    		s.setFlushMode(FlushMode.MANUAL);
    		s.update(bean);
    		s.flush();
    		s.close();			
    	}
    My spring bean xml file:

    Code:
    	<!-- Hibernate Session Factory -->
    	<bean id="spring.hibernate.sessionfactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    		<property name="annotatedClasses">
    			<list>
    				<value>...</value>
    				<value>...</value>			
    			</list>
    		</property>
    		<property name="dataSource"><ref bean="spring.jdbc.dataSource"/></property>		
    		<property name="hibernateProperties">
    			<props>
    				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>				
    				<prop key="hibernate.show_sql">true</prop>								
    			</props>
    		</property>
    	</bean>
    
    	<!-- enable the configuration of transactional behavior based on annotations -->
    	<tx:annotation-driven transaction-manager="transactionManager"/>
    
    	<!-- Transaction Manager -->
    	<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    		<property name="sessionFactory" ref="spring.hibernate.sessionfactory"/>
    	</bean>		
    	
    	<!-- Data Source -->
        <bean id="spring.jdbc.dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    		<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
    		<property name="url"><value>jdbc:mysql://localhost/model_config</value></property>
    		<property name="username"><value>root123</value></property>
    		<property name="password"><value>pass123</value></property>
        </bean>
    	
        <bean id="test.BeanDao" class="test.BeanDao">	 
    		<property name="sessionFactory"><ref local="spring.hibernate.sessionfactory"/></property>
    	</bean>

    When I update the attribute from my JUnit test, all is successful and the value is updated in the database. But when I use JConsole, I run into this exception.

    Any help will be much appreciated.

  2. #2
    Join Date
    Feb 2008
    Posts
    15

    Default

    After some googling, I found that this is a hibernate issue which is to be fixed in version 4
    There is a discussion and workaround posted at:
    http://opensource.atlassian.com/proj...rowse/HHH-2281
    http://jira.springframework.org/browse/SPR-3571


    I am using Spring JMX and thought that the workaround to set "exposeManagedResourceClassLoader" to true would help solve my issue.

    The default value for "exposeManagedResourceClassLoader" is true in Spring 2.5.3 which I am using. Even though I tried to explicitly set that value to true, I still run into the same exception.

  3. #3
    Join Date
    Jun 2008
    Posts
    1

    Default

    Temp workaround that works for me : i suggest to swap currentThread()-classloader by means of an aspect (or Spring AOP if you like)
    cause usually Hibernate and AOP-classes are loaded as a part of appllication by WebAppClassloader in most cases.

    @Around("methodsThatAreUsingHibernate()")
    public void cancheClassLoader(final ProceedingJoinPoint pjp) throws Throwable {
    ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
    Thread.currentThread().setContextClassLoader(getCl ass().getClassLoader());
    try {
    pjp.proceed();
    }
    finally{ Thread.currentThread().setContextClassLoader(conte xtClassLoader);
    }
    }

  4. #4
    Join Date
    May 2009
    Posts
    4

    Default jar hell

    Hi,

    I would like to try this workaround with AOP however I'm completely new to Aspect. I configured my pom with those dependencies :

    Code:
    	<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring</artifactId>
    <version>2.5.6</version>
    		</dependency>
     
    		<dependency>
    			<groupId>org.springframework</groupId>
    			<artifactId>spring-aop</artifactId>
    <version>2.5.6</version>
    		</dependency>
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjrt</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.aspectj</groupId>
    			<artifactId>aspectjweaver</artifactId>
    			<version>1.6.5</version>
    		</dependency>
    but the @Around and @Aspect annotations are still unknow in my project.
    Does anybody know what are the dependencies needed for that ?

    Thanks

  5. #5
    Join Date
    May 2009
    Posts
    4

    Default

    sorry, it was the maven-eclipse-plugin who didn't put aspectj in the classpath. I don't know why, but with version 2.5 it works.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •