6

EJB3エンティティとHibernateを使用してPostgreSQLデータベースにデータを永続化するサーバー上のSpringコンテナーを使用するアプリケーションがあります。

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

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

接続している DBMS に特定の Hibernate ダイアレクトが必要ですか?

参考までに、Spring の現在の Entity Manager Factory の XML 定義を次に示します。

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

更新/進行状況: 21/3/13

ベンダーと何度もやり取りした後、単純な Java テスト プログラムで JDBC ドライバーを動作させることができました。

残念ながら、Spring が次のスタック トレースで EntityManagerFactory の作成に失敗するため、Hibernate が十分な情報を取得するには 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

そのため、独自の方言サブクラスを作成する必要があるようです。どこから始めるべきか、またはどの既存のサブクラスを拡張するべきかについて、誰かが私に何か指針を教えてくれますか?

4

2 に答える 2

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>
于 2013-03-11T14:38:23.670 に答える
0

Hibernate は、DataSource 以外の接続プールを使用できます。したがって、c3p0、proxool、dbcp、さらには独自の接続プールを使用できます。Hibernate には接続プールが組み込まれていますが、これはテスト/プロトタイピングのみを目的としています。ドライバー名、URL、ユーザー名、パスワードを渡すだけで、(非常に) 単純なプーリングがセットアップされます。

これを実現するには、いくつかの異なるオプションがあります。まず、Hibernate は常に統一されたコントラクトを通じて接続の取得と解放を処理します: org.hibernate.engine.jdbc.connections.spi.ConnectionProvider. したがって、1 つのオプションは、独自の ConnectionProvider 実装を渡すことです。

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

他の回答が指摘しているように、別のオプションは、ドライバーと接続情報に DataSource ラッパーを使用することです。

申し訳ありませんが、私は Spring を知らないので、persistence.xml または JPA 設定または Hibernate 設定を指定する Spring 固有の方法をすべて知っているわけではありません。

于 2013-03-16T16:09:28.200 に答える