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

}

这种方式在启动整个过程时只需完成一次设置,但所需的数据可能是“外包”的。

再次感谢您为我指明正确的方向!

于 2012-08-29T16:26:29.660 回答
0

您引用的值占位符${my.clazz.smth}通常是从属性文件中读取的,而不是直接从类中读取的。

这是使用 Spring 的PropertyPlaceholderConfigurer完成的。

这是一个结合了 Hibernate 和 Spring 的项目示例。

于 2012-08-17T21:43:59.730 回答
0

如果您确实需要将配置延迟到运行时(例如,从外部源(例如 Web 服务)获取数据库凭据),您可以使用Hibernate API Programatic Configuration来完成,特别是Ejb3Configuration用于旧版本的 Hibernate 或ServiceRegistryBuilder(v 4 。X)...

但请注意,据我所知,没有办法动态更新PersintenceUnit. 每次需要更改其属性时,您都必须EntityManagerFactory从一个新实例(一个非常昂贵的操作)构建另一个。Configuration无论如何,除非您有充分的理由,不要从您的应用程序管理数据库凭据,而是将其委托给 JNDI-Bound DataSource

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