我希望我的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。
那么,我该如何设置呢? :)
提前致谢!
答案 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();