6

Springと組み合わせてHibernateを使用しています。データベースとして、現在、データをファイルに保存するHSQLを使用しています(SQLiteなど)。HSQL ファイルへのパスは現在、persistence.xml にハードコーディングされています。実行時にこの値にアクセスして変更し、ユーザーが任意の HSQL ファイルをロードおよび保存できるようにするにはどうすればよいですか?

persistence.xml:

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                                 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">

    <persistence-unit name="something-unit">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <properties>
            <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" />
            <property name="hibernate.connection.url" value="jdbc:hsqldb:file:~/something-db/somethingdb" />
            <property name="hibernate.connection.username" value="sa" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
        </properties>
    </persistence-unit>

</persistence>

Spring applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:data="http://www.springframework.org/schema/data/jpa"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="
               http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-2.5.xsd
               http://www.springframework.org/schema/data/jpa
               http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
               http://www.springframework.org/schema/tx
               http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">


    <!-- Database Setup -->

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="something-unit" />
    </bean>

    <data:repositories base-package="com.something.playlist"/>

    <!-- Transaction Setup -->

    <tx:annotation-driven/>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

</beans>

ヒントをありがとう!

4

3 に答える 3

3

JNDI データソースを指定して Hibernate に渡すことができます。または、インターフェイス org.hibernate.connection.ConnectionProvider を実装することで、JDBC 接続を取得するための独自のプラグイン戦略を定義できます。

その他のヒントについては、http: //docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.htmlを参照してください。

編集 2/16:カスタム ConnectionProvider の作成に関する StackOverflow の例があります: How can I set Datasource when I'm creating Hibernate SessionFactory?

起動時ではなくオンザフライでデータ ソースを変更する場合は、Hibernate セッション ファクトリを再起動する必要があります。正しく行うには、再起動時にトランザクションが実行されていないことを確認する必要があります。次の質問/回答が役に立ちます。春

于 2013-02-13T20:25:43.870 に答える
1

JPA 抽象化を介して hibernate を使用する場合は、javax.persistence.EntityManagerFactory を使用するコードまたはサービスを作成できます。これらのいずれかを自動配線し、createEntityManager(Map map) を呼び出します。マップにデータソースを提供できます。データソースを作成するためにパラメーターをスレッドローカルから引き出す独自の実装でエンティティマネージャーをラップできます。

編集: コンテキストを読み間違えて、EntityManagerFactory を使用していることがわかりました。その場合は、スレッドローカルから正しいデータソースを作成するデリゲートで Factory をラップする最後の部分を読んでください。

于 2013-02-18T14:48:11.807 に答える