将外部数据插入persistence.xml

时间:2012-08-17 21:09:37

标签: java xml spring

我希望我的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} -way。

那么,我该如何设置呢? :)

提前致谢!

3 个答案:

答案 0 :(得分: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 :(得分:0)

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

这是使用Spring的PropertyPlaceholderConfigurer完成的。

这是一个项目的example,它结合了Hibernate和&amp;弹簧。

答案 2 :(得分:0)

如果确实需要将配置延迟到运行时(例如,要从外部源(如Web服务)获取数据库凭据),可以使用Hibernate API Programatic Configuration执行此操作,尤其是Ejb3Configuration Hibernate的版本或ServiceRegistryBuilder(v 4.X)......

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

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

EntityManagerFactory emf= cfg.buildEntityManagerFactory();