[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1737?page=c...
]
Adrian Riley commented on HHH-1737:
-----------------------------------
Maybe I'm being stupid here, but this doesn't seem to work.
Calling getWrappedConnection() results in a call to the invoke() method of
BorrowedConnectionProxy, which then calls ConnectionManager.getConnection(). This returns
the NewProxyConnection which wraps the underlying Oracle Connection instance, and not the
underlying connection itself. Calling ArrayDescriptor.createArrayDescriptor passing this
connection results in a ClassCastException, exactly as before.
Have I missed something?
Add a ConnectionWrapper interface to allow access to the underlying
connection from a BorrowedConnectionProxy
-------------------------------------------------------------------------------------------------------------
Key: HHH-1737
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-1737
Project: Hibernate3
Type: Bug
Components: core
Versions: 3.1.1, 3.1.2, 3.1.3
Environment: Hibernate 3.1.3, Oracle 9.2.0.4
Reporter: Nick Reid
Assignee: Steve Ebersole
Fix For: 3.2.1
The borrowConnection functionality now prevents us from accessing the native connection
to perform necessary operations (LOB handling, OAQ integration). Instead of just
returning a simple proxy the implements java.sql.Connection the proxy could additionally
implement an interface that allows users to access the wrapped connection returned by the
ConnectionManager.
i.e.
public interface BorrowedConnection extends java.sql.Connection
{
java.sql.Connection getTargetConnection()
}
public class BorrowedConnectionProxy implements InvocationHandler {
private final ConnectionManager connectionManager;
private boolean useable = true;
public BorrowedConnectionProxy(ConnectionManager connectionManager) {
this.connectionManager = connectionManager;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if ( "close".equals( method.getName() ) ) {
connectionManager.releaseBorrowedConnection();
return null;
}
if ( "getTargetConnection".equals( method.getName() ) ) {
return connectionManager.getConnection();
}
// should probably no-op commit/rollback here, at least in JTA scenarios
if ( !useable ) {
throw new HibernateException( "connnection proxy not usable after transaction
completion" );
}
try {
return method.invoke( connectionManager.getConnection(), args );
}
catch( InvocationTargetException e ) {
throw e.getTargetException();
}
}
public static Connection generateProxy(ConnectionManager connectionManager) {
BorrowedConnectionProxy handler = new BorrowedConnectionProxy( connectionManager );
return ( Connection ) Proxy.newProxyInstance(
Connection.class.getClassLoader(),
new Class[] { BorrowedConnection.class },
handler
);
}
public static void renderUnuseable(Connection connection) {
if ( connection != null && Proxy.isProxyClass( connection.getClass() ) ) {
InvocationHandler handler = Proxy.getInvocationHandler( connection );
if ( BorrowedConnectionProxy.class.isAssignableFrom( handler.getClass() ) ) {
( ( BorrowedConnectionProxy ) handler ).useable = false;
}
}
}
}
We could always get access to the connectionManager field of the invocation handler via
reflection, but this is not supportable or maintainable.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira