4

具体的には、persistence.xml でそのプロパティの一部を動的に設定する必要があります。

<property name="hibernate.connection.password" value="password"/>
<property name="hibernate.connection.username" value="username"/>

必要なデータを提供できるクラスを作成できますが、次のように機能するようにクラスを設定する方法がわかりません。

<property name="hibernate.connection.password" value="${my.clazz.pass}"/>
<property name="hibernate.connection.username" value="${my.clazz.user}"/>

このようにクラスを設定しようとしました

public class clazz{

  String pass;
  String user;

  public clazz(){
    //do stuff to set pass and user
  }

  //getter/setter
}

しかし、それはうまくいきません。ここでもグーグルでも方法は見つかりませんでしたが、 ${my.clazz.smth} の方法は何度か見ました。

それで、どうすればそれを設定できますか?:)

前もって感謝します!

4

3 に答える 3

2

だから、これはしばらく前に解決しましたが、私はまだ答えませんでした:

Anthony Accioly は正しい方向を示してくれました。

これを私のapplicationContext.xmlのentityManagerFactoryに追加しました

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitPostProcessors">
        <bean class="my.package.SetupDatabase">
        </bean>
    </property>
    //the other stuff
</bean>

対応するクラス。この場合は hibernate を使用します。

package my.package;

public class SetupDatabase implements PersistenceUnitPostProcessor {

    private String username;
    private String password;
    private String dbserver;

    public void SetupDatabase(){
        //do stuff to obtain needed information
    }

    public void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
        pui.getProperties().setProperty("hibernate.connection.username", username );
        pui.getProperties().setProperty("hibernate.connection.password", password);
        pui.getProperties().setProperty("hibernate.connection.url", dbserver ); 
    }

}

この方法では、セットアップはすべてを開始するときに 1 回だけ行われますが、必要なデータは「外部委託」される場合があります。

私を正しい方向に向けてくれてありがとう!

于 2012-08-29T16:26:29.660 に答える
0

実行時まで構成を本当に遅らせる必要がある場合(たとえば、Webサービスなどの外部ソースからデータベース資格情報を取得するため)、Hibernate APIプログラム構成、特にレガシーバージョンのHibernateまたはServiceRegistryBuilder(v 4 。バツ)...

ただし、私の知る限り、のユーザー名とパスワードを動的に更新する方法はないことに注意してPersintenceUnitください。プロパティを変更する必要があるたびにEntityManagerFactory、新しいインスタンスから別のインスタンスを構築する必要があります(非常にコストのかかる操作)。Configurationとにかく、本当に正当な理由がない限り、アプリケーションからデータベースクレデンシャルを管理せず、DataSource代わりにJNDIバウンドに委任してください。

Ejb3Configuration cfg = new Ejb3Configuration()
  // Add classes, other properties, etc
  .setProperty("hibernate.connection.password", "xxxx")
  .setProperty("hibernate.connection.username", "yyyy"); 

EntityManagerFactory emf= cfg.buildEntityManagerFactory();
于 2012-08-17T22:46:07.853 に答える
0

参照する値のプレースホルダー${my.clazz.smth}は、通常、クラスから直接ではなく、プロパティ ファイルから読み取られます。

これは、Spring のPropertyPlaceholderConfigurerを使用して行われます。

これは、Hibernate と Spring を組み合わせたプロジェクトの例です。

于 2012-08-17T21:43:59.730 に答える