2013-03-01 21 views
5

私たちはEJB3エンティティとHibernateを使用してPostgreSQLデータベースにデータを保持するサーバー上のSpringコンテナを使用するアプリケーションを持っています。Spring/JPA/Hibernateは単純なJDBC準拠のドライバを使用できますか?

別のEntityManagerを使用して別のデータベースに別の接続を追加したいのですが、DBMS(Trifox Vortex)のベンダーにはDataSourceタイプのドライバがありません。

Hibernate EntityManagerは、単純なJDBC準拠のドライバを使用してエンティティのEJB3 JPA永続性を実装できますか?

接続先のDBMSに特定のHibernate Dialectが必要ですか?

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="UniWorks-EntityPersistenceUnit"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 
    </property> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
     <property name="showSql" value="${db.showsql}"/> 
     <property name="generateDdl" value="${db.generate}"/> 
     <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect"/> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
     <prop key="hibernate.hbm2ddl.auto">${db.hbm2ddl}</prop> 
     </props> 
    </property> 
    </bean> 

UPDATE/PROGRESS:

それは価値がある何のため

が、ここでは春の当社の現在のエンティティマネージャファクトリのXML定義です 21/3/13

後くらいに、INGとベンダーと話をしながら、私はJDBCドライバをシンプルなJavaテストプログラムで動作させることができました。 Hibernateは十分な情報を取得するための春には、次のスタックトレースとのEntityManagerFactory作成に失敗したとして

は残念ながら、彼らのJDBCドライバは明らかに十分ではありません。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in URL [bundle://222.0:0/META-INF/spring/cobol.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: UniWorks-CobolPersistenceUnit] Unable to build EntityManagerFactory 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1455)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:913)[59:org.springframework.context:3.1.1.RELEASE] 
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.access$1600(AbstractDelegatedExecutionApplicationContext.java:69)[90:org.springframework.osgi.core:1.2.1] 
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext$4.run(AbstractDelegatedExecutionApplicationContext.java:355)[90:org.springframework.osgi.core:1.2.1] 
    at org.springframework.osgi.util.internal.PrivilegedUtils.executeWithCustomTCCL(PrivilegedUtils.java:85)[90:org.springframework.osgi.core:1.2.1] 
    at org.springframework.osgi.context.support.AbstractDelegatedExecutionApplicationContext.completeRefresh(AbstractDelegatedExecutionApplicationContext.java:320)[90:org.springframework.osgi.core:1.2.1] 
    at org.springframework.osgi.extender.internal.dependencies.startup.DependencyWaiterApplicationContextExecutor$CompleteRefreshTask.run(DependencyWaiterApplicationContextExecutor.java:132)[91:org.springframework.osgi.extender:1.2.1] 
    at java.lang.Thread.run(Thread.java:662)[:1.6.0_24] 
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: UniWorks-CobolPersistenceUnit] Unable to build EntityManagerFactory 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.hibernate.ejb.HibernatePersistence.createContainerEntityManagerFactory(HibernatePersistence.java:132)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:268)[64:org.springframework.orm:3.1.1.RELEASE] 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)[64:org.springframework.orm:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1514)[58:org.springframework.beans:3.1.1.RELEASE] 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1452)[58:org.springframework.beans:3.1.1.RELEASE] 
    ... 14 more 
Caused by: org.hibernate.HibernateException: Unable to access java.sql.DatabaseMetaData to determine appropriate Dialect to use 
    at org.hibernate.dialect.resolver.DialectFactory.determineDialect(DialectFactory.java:141)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.hibernate.dialect.resolver.DialectFactory.buildDialect(DialectFactory.java:97)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:117)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2119)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2115)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1339)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)[80:com.springsource.org.hibernate:3.3.2.GA] 
    at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)[80:com.springsource.org.hibernate:3.3.2.GA] 
    ... 19 more 
Caused by: java.sql.SQLException: getDatabaseMajorVersion: Not supported by VORTEXjdbc. 
    at vortex.sql.vortexDbMetaData.getDatabaseMajorVersion(vortexDbMetaData.java:362) 
    at org.hibernate.dialect.resolver.DialectFactory.determineDialect(DialectFactory.java:131)[80:com.springsource.org.hibernate:3.3.2.GA] 
    ... 26 more 

だから、私が書く必要がありますように見えますが、私の独自の方言サブクラス。誰かがどこを見始めるか、既存のサブクラスを拡張するためのポインタを教えてください。

答えて

3

これは(SimpleDriverDataSource + org.springframework.orm.jpa.vendor.Database.DEFAULTを)動作するはずです:

<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource"> 
     <property name="driverClass" value="org.h2.Driver"/> <!-- put your driver here --> 
     <property name="url" value="jdbc:h2:mem:test"/> <!-- put your jdbc url here --> 
     <property name="username" value="sa"/> 
     <property name="password" value=""/> 
    </bean> 

      <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="persistenceUnitName" value="TestPersistenceUnit"/> 
     <property name="jpaDialect"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/> 
     </property> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
       <property name="showSql" value="false"/> 
       <property name="database" value="DEFAULT"/> 
      </bean> 
     </property> 
    </bean> 
+0

あなたの答えをありがとう。奨励金を払う前にあなたの理論をテストするための実例を試してみようと思っていますが、締め切り前にそこに着くように見えなければ、とにかくそれをあげるでしょう。乾杯。 – DuncanKinnear

+0

すべての返信はありますか? :) –

+0

私があなたに提供したコードは確かに私が期待したよりもずっと多くなっているので、私はあなたに賞金を与えました。この段階では、(スタックトレースから)Springが単純なドライバデータソースを作成しているhibernateを呼び出すことができますが、現時点では実際のドライバ自体がユーザ名とパスワードに関するエラーを投げているので、ほぼそこに。ありがとう。 – DuncanKinnear

0

Hibernateがデータソース以外の接続プールを使用することができます。したがって、c3p0またはproxoolまたはdbcpを使用することも、独自の接続プールを使用することもできます。 Hibernateには接続プールが組み込まれていますが、テスト/プロトタイプ作成のためのものです。ドライバ名、URL、ユーザ名、パスワードを渡すだけで、(非常に)シンプルなプーリングを設定できます。

これを達成するためのオプションはいくつかあります。まず、Hibernateは、統合された契約(org.hibernate.engine.jdbc.connections.spi.ConnectionProvider)で接続の取得と解放を常に処理します。ですから、独自のConnectionProvider実装を渡すこともできます。

別のオプションは、ドライバ、URL、ユーザー名、パスワード、および使用するConnectionProviderを渡すことです。ドライバ、url、ユーザ名、パスワードに関しては、HibernateとJPAの両方がそれを行うための仕組みを定義しています。 JPAの場合、persistence.xmlまたは設定javax.persistence.jdbc.driver,javax.persistence.jdbc.urljavax.persistence.jdbc.userjavax.persistence.jdbc.passwordのいずれかを使用します。 ConnectionProviderに関しては、デフォルトでHibernateは、サポートされていない、本番用ではないものを選択します。しかし、使用する別のものをHibernateに伝えるには、hibernate.connection.provider_classの設定を使用します。 Hibernateにはc3p0とproxoolの両方をバックエンド接続プールとして統合するための組み込みサポートがあります(Hibernateはc3p0/proxoolプールを設定して管理し、そのプールを接続管理に使用します)。

もう1つの選択肢として、ドライバと接続情報の周囲にDataSourceラッパーを使用する方法があります。

残念ですが、私はSpringを知らないので、persistence.xmlまたはJPA設定や休止状態の設定を指定するためのSpring固有の方法はすべてわかりません。

関連する問題