我正在以JPA模式开发一个带有Hibernate的纯Java应用程序。文件persistence.xml包含一个持久性单元:
现在我们正在发布应用程序,我希望有一个配置:测试模式,开发模式和生产模式。他们显然会有不同的数据库访问凭据和自动更新选项。
我能想到的唯一可能性对我来说只有缺点:
我该怎么做?
答案 0 :(得分:0)
我能想到的一个解决方案是,如果您有办法检测应用程序的环境,可以使用不同的属性启动它。 而不是打电话:
Persistence.createEntityManagerFactory("our.unit");
使用
Map<String, Object> props = new TreeMap<>();
Persistence.createEntityManagerFactory("our.unit",props);
根据环境填充属性。
当然,除非您正在使用CDI。
答案 1 :(得分:0)
如果您将同时使用两个持久性单元的实体,为什么需要将所有 标签复制到每个标签?
为什么你没有使用
<exclude-unlisted-classes>false</exclude-unlisted-classes>
例如:
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="persistenceUnit_1">
<provider> xxx </provider>
<jta-data-source> xxxx </jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
//Properties of first persistence unit
</properties>
</persistence-unit>
<persistence-unit name="persistenceUnit_2">
<provider> xxx </provider>
<jta-data-source> xxxx </jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
//Properties of second persistence unit
</properties>
</persistence-unit>
</persistence>
在这种情况下,您需要按名称使用它,例如
@PersistenceContext(unitName = "persistenceUnit_1")
private EntityManager entityManager;
答案 2 :(得分:0)
试试这个:
在你的 src\main\resources\META-INF\persistence.xml 文件中
<?xml version="1.0" encoding="utf-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="schemaTest" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://x.x.x.x/SCHEMA_TEST?serverTimezone=UTC" />
<property name="javax.persistence.jdbc.user" value="xxx" />
<property name="javax.persistence.jdbc.password" value="xxx" />
<property name="javax.persistence.schema-generation.database.action" value="update" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.jdbc.time_zone" value="UTC" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="use_sql_comments" value="false" />
</properties>
</persistence-unit>
<persistence-unit name="schemaProd" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://x.x.x:x/SCHEMA_PROD?serverTimezone=UTC" />
<property name="javax.persistence.jdbc.user" value="xxx" />
<property name="javax.persistence.jdbc.password" value="xxx" />
<property name="javax.persistence.schema-generation.database.action" value="update" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<property name="hibernate.jdbc.time_zone" value="UTC" />
<property name="hibernate.show_sql" value="false" />
<property name="hibernate.format_sql" value="false" />
<property name="use_sql_comments" value="false" />
</properties>
</persistence-unit>
</persistence>
现在,关于进行查询的方法:
字符串 'argSchema' 应根据您当前的需要设置在 'schemaTest' 和 'schemaProd' 之间。
String argSchema = "schemaTest";
SessionFactory factory = (SessionFactory)
Persistence.createEntityManagerFactory(argSchema);
Session session = factory.openSession();
Transaction tx = null;
try {
tx = session.beginTransaction();
...
tx.commit();