2016-04-12 9 views
0

私のアプリケーションでは、Hibernate 5.0.7とPostgreSQLを使用しています。 さらに、私はdouble []データ型の列を持つテーブルを持っています。 は私がのUserTypeインタフェースを実装するクラスを作成し、私のエンティティでHibernateでそのフィールドをマップするには:Hibernateのカスタムdouble [] UserType

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 }; 
    } 
} 

私は含むエンティティを保存しよう[]、CCODEは、次の例外で失敗し、二重

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) 

私のDoubleArrayUserTypeクラスのArray array = connection.createArrayOf("DOUBLE", doubles);という行に由来します。
文字列val "DOUBLE"は不適切ですが、私はその理由を理解できません。誰にもアイデアはありますか?

+0

あなたが呼び出すクラス(com.mchange.v2.c3p0.NewProxyConnection)が、古いインタフェース定義、つまり古いJDKに対してコンパイルされているという問題があると思います。 – Michal

+0

私はMavenにc3p0を含めて、ちょうど最新バージョン(0.9.5.2)を試しました。このようなエラーはどのようにして可能ですか?どのように私はそれを修正することができる任意のアイデア? – Tobson

+0

私はc3p0の最新マスターをクローンしました。README statetingはJDBC 3.0とjvm.target.version = 1.6を定義するbuild.propertiesファイルをサポートしています。 JDK 1.7以降のJDBCは下位互換性がありません。 http://www.oracle.com/technetwork/java/javase/compatibility-417013.html#incompatibilities – Michal

答えて

1

使用されているc3p0接続プールがまだJDBC 4.1をサポートしていないようです。

1.7+ JDKで別の接続プールを使用するか、c3p0をコンパイルする必要があります。

+0

基本的には、私が持っている必要条件でc3p0を使うことはできません。 JDBC 4.1をサポートしていますか? – Tobson

+0

はい、それか、おそらく1.7 + JDKと1.7+ターゲットでc3p0をコンパイルしようとします。しかし、ソースには微妙な調整が必要な場合がありますが、どれくらい考えているのでしょうか。私は別の接続プールに行きます。 – Michal

関連する問題