2016-04-12 9 views
0

Ich verwende Hibernate 5.0.7 und PostgreSql in meiner Anwendung. Außerdem habe ich eine Tabelle, die eine doppelte [] Datentypspalte hat. Um dieses Feld mit Hibernate in meiner Einheit Karte ich eine Klasse erstellt, die die Usertype-Schnittstelle implementiert:Benutzerdefiniert double [] UserType mit Hibernate

import org.apache.commons.lang3.ArrayUtils; 
import org.hibernate.HibernateException; 
import org.hibernate.engine.spi.SessionImplementor; 
import org.hibernate.usertype.UserType; 

import java.io.Serializable; 
import java.sql.*; 

public class DoubleArrayUserType implements UserType { 
    protected static final int SQLTYPE = java.sql.Types.ARRAY; 

    @Override 
    public Object nullSafeGet(final ResultSet rs, final String[] names, final SessionImplementor sessionImplementor, final Object owner) throws HibernateException, SQLException { 
     Array array = rs.getArray(names[0]); 
     Double[] javaArray = (Double[]) array.getArray(); 
     return ArrayUtils.toPrimitive(javaArray); 
    } 

    @Override 
    public void nullSafeSet(final PreparedStatement statement, final Object object, final int i, final SessionImplementor sessionImplementor) throws HibernateException, SQLException { 
     Connection connection = statement.getConnection(); 

     double[] castObject = (double[]) object; 
     Double[] doubles = ArrayUtils.toObject(castObject); 
     Array array = connection.createArrayOf("DOUBLE", doubles); 

     statement.setArray(i, array); 
    } 

    @Override 
    public Object assemble(final Serializable cached, final Object owner) throws HibernateException { 
     return cached; 
    } 

    @Override 
    public Object deepCopy(final Object o) throws HibernateException { 
     return o == null ? null : ((double[]) o).clone(); 
    } 

    @Override 
    public Serializable disassemble(final Object o) throws HibernateException { 
     return (Serializable) o; 
    } 

    @Override 
    public boolean equals(final Object x, final Object y) throws HibernateException { 
     return x == null ? y == null : x.equals(y); 
    } 

    @Override 
    public int hashCode(final Object o) throws HibernateException { 
     return o == null ? 0 : o.hashCode(); 
    } 

    @Override 
    public boolean isMutable() { 
     return false; 
    } 

    @Override 
    public Object replace(final Object original, final Object target, final Object owner) throws HibernateException { 
     return original; 
    } 

    @Override 
    public Class<double[]> returnedClass() { 
     return double[].class; 
    } 

    @Override 
    public int[] sqlTypes() { 
     return new int[] { SQLTYPE }; 
    } 
} 

Wenn ich versuche, eine Einheit zu speichern enthält eine doppelte [], die ccode mit der folgenden Ausnahme nicht

java.lang.AbstractMethodError: com.mchange.v2.c3p0.impl.NewProxyConnection.createArrayOf(Ljava/lang/String;[Ljava/lang/Object;)Ljava/sql/Array; 

    at com.mycompany.DoubleArrayUserType.nullSafeSet(DoubleArrayUserType.java:30) 
    at org.hibernate.type.CustomType.nullSafeSet(CustomType.java:141) 
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2598) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2883) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3386) 
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:89) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:560) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:434) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1282) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:465) 
    at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:2963) 
    at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2339) 
    at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:485) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:147) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$100(JdbcResourceLocalTransactionCoordinatorImpl.java:38) 
    at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:231) 
    at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:65) 
    at org.hibernate.jpa.internal.TransactionImpl.commit(TransactionImpl.java:61) 
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:517) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:131) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) 
    at com.sun.proxy.$Proxy141.save(Unknown Source) 

die stammt in der Linie Array array = connection.createArrayOf("DOUBLE", doubles); meiner DoubleArrayUserType Klasse.
Es scheint, dass die Zeichenfolge val "DOUBLE" nicht geeignet ist, aber ich kann nicht herausfinden, warum. Hat jemand irgendwelche Ideen?

+0

Ich denke, das Problem ist, dass die Klasse, die Sie aufrufen (com.mchange.v2.c3p0.NewProxyConnection) wurde gegen ältere Schnittstellendefinition, das heißt mit älteren JDK kompiliert wurde. – Michal

+0

Ich habe c3p0 mit Maven aufgenommen und gerade die neueste Version (0.9.5.2) ausprobiert. Wie kann ein solcher Fehler überhaupt möglich sein? Irgendwelche Ideen, wie ich es beheben könnte? – Tobson

+0

Ich habe neuesten Master von c3p0 geklont, gibt es README Stateting es unterstützt JDBC 3.0 und build.properties Datei definiert jvm.target.version = 1.6. JDBC ab JDK 1.7 ist nicht abwärtskompatibel. http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#incompatibilities – Michal

Antwort

1

Es sieht so aus, als ob der verwendete c3p0-Verbindungspool JDBC 4.1 noch nicht unterstützt.

Sie müssen einen anderen Verbindungspool verwenden oder c3p0 auf 1.7+ JDK kompilieren.

+0

Also im Grunde sagen Sie, dass ich c3p0 überhaupt nicht mit den Anforderungen, die ich habe, bis sie verwenden kann/kann JDBC 4.1 Unterstützung haben? – Tobson

+0

Ja, entweder, oder vielleicht versuchen, c3p0 mit 1.7+ JDK und 1.7+ Ziel zu kompilieren. Es ist jedoch möglich, dass die Quellen etwas basteln müssen, ich habe keine Ahnung wie viel. Ich würde für einen anderen Verbindungspool gehen. – Michal

Verwandte Themen