我需要能够在src|main|java|dbConnection.properties
中存储数据库配置属性,并以 jstl 表达式的形式将其包含到hibernate.cfg.xml
。 (如:$ {密码}等)。怎么做?
当前的hibernate.cfg.xml:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="connection.username">postgres</property>
<property name="connection.password">postgres</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
</session-factory>
</hibernate-configuration>
我需要这样的事情:
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">${DRIVER}</property>
<property name="connection.username">${USERNAME}</property>
<property name="connection.password">${PASSWORD}</property>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
</session-factory>
</hibernate-configuration>
答案 0 :(得分:6)
您可以通过编程方式完成。
hibernate.cfg.xml应如下所示。
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
</session-factory>
</hibernate-configuration>
dbConnection.properties
connection.driver_class=org.postgresql.Driver
connection.username=postgres
connection.password=postgres
创建SessionFactory
时,您可以执行以下操作。
Properties dbConnectionProperties = new Properties();
try {
dbConnectionProperties.load(ClassLoader.getSystemClassLoader().getResourceAsStream("dbConnection.properties"));
} catch(Exception e) {
// Log
}
SessionFactory sessionFactory = new Configuration().mergeProperties(dbConnectionProperties).configure().buildSessionFactory();
答案 1 :(得分:6)
你声明你使用Spring然后为什么不让Spring做所有艰苦的工作。让属性占位符替换所需的占位符。
<context:property-placeholder location="classpath:dbConnection.properties" />
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="hibernateProperties">
<map>
<entry key="connection.driver_class" value="${DRIVER}" />
<entry key="connection.username" value="${USERNAME}" />
<entry key="connection.password" value="${PASSWORD}" />
<entry key="transaction.factory_class" value="org.hibernate.transaction.JDBCTransactionFactory" />
</map>
<property>
</bean>
免费建议而不是使用内部hibernate连接(不建议在生产中使用)在spring中配置数据源并将其连接到LocalSessionFactoryBean
答案 2 :(得分:5)
关注this,this和this我提出了以下Maven配置,它使用属性文件中的属性替换/过滤hibernate.cfg.xml文件中的占位符: / p>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/extra-resources</outputDirectory>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
<!-- Specify the file that contains the value to replace the placeholders -->
<filters>
<filter>src/main/resources/dbConnection.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<excludes>
<exclude>*</exclude>
</excludes>
<includes>
<include>hibernate.cfg.xml</include>
</includes>
</resource>
</resources>
</build>
使用此配置,您可以运行验证 Maven目标来生成过滤后的文件并查看它们是否正确地重新定位
如果您使用Maven,这当然很有用。