我可以在创建 EntityManager 之前设置架构吗?
Can I set the schema before creating the EntityManager?
我需要使用具有不同属性的多个持久性单元(在我的例子中 MySQL 和 Oracle 数据库)。在 persistence.xml 中,我定义了两个不同的 "persistence-unit" 并仅列出了实体 class。
可以在 persitence.xml 和
中设置属性
<properties>
<property name="..." value="..." />
...
我在创建 EntityManager 之前在 java class 中执行此操作,因为我必须使用不同的属性(我之前阅读过):
EntityManagerFactory factory;
...
HashMap<String, String> dbProperties = new HashMap<String, String>();
dbProperties.put("javax.persistence.jdbc.driver", driver);
dbProperties.put("javax.persistence.jdbc.url", url);
dbProperties.put("javax.persistence.jdbc.user", user);
dbProperties.put("javax.persistence.jdbc.password", password);
dbProperties.put("eclipselink.ddl-generation", "none");
dbProperties.put("eclipselink.ddl-generation.output-mode", "database");
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, dbProperties);
EntityManager em = factory.createEntityManager();
...
对于 Oracle,我需要动态设置模式(如果可能的话),而不是在每个实体 class.
的 @Table 注释中进行硬编码
目前我使用的是常量(意味着它不是动态的)
@Table(name="MYTABLE", schema = Constants.ORACLE_SCHEMA)
我想用
@Table(name="MYTABLE")
并将架构设置为属性
dbProperties.put(...)
有这样的属性吗?
在我的搜索中,我发现了一个语法可以提供帮助
ALTER SESSION SET CURRENT_SCHEMA=MYSCHEMA
但我不知道如何将它与 EntityManager 结合起来。
我已经询问了所有可用的属性,但还没有找到任何东西。
提前致谢。
我在这个 post 的帮助下找到了解决方案:https://community.oracle.com/thread/2270534?tstart=0
创建EntityManager后通过查询即可:
...
EntityManager em = factory.createEntityManager();
Query query;
em.getTransaction().begin();
query = em.createNativeQuery("ALTER SESSION SET CURRENT_SCHEMA="+schemaName);
query.executeUpdate();
em.getTransaction().commit();
检查当前架构:
query = em.createNativeQuery("SELECT SYS_CONTEXT('USERENV','SESSION_SCHEMA') FROM DUAL");
System.out.println("Current schema: " + query.getResultList());
我不确定这是否能解决您的问题,但一些应用程序服务器供应商可能会使用名为 InitSql 的东西。
它是一个 SQL 语句,在每次成功建立数据库连接时 运行。
我无法在 Java SE 中为 EclipseLink 找到类似的东西,但也许有一个 post 结帐 SQL 可以 运行 像 InitSql
就像 Andreas L. 的回答一样,这可以让您 运行 命令,例如 .
ALTER SESSION SET CURRENT_SCHEMA=xxx
我需要使用具有不同属性的多个持久性单元(在我的例子中 MySQL 和 Oracle 数据库)。在 persistence.xml 中,我定义了两个不同的 "persistence-unit" 并仅列出了实体 class。
可以在 persitence.xml 和
中设置属性<properties>
<property name="..." value="..." />
...
我在创建 EntityManager 之前在 java class 中执行此操作,因为我必须使用不同的属性(我之前阅读过):
EntityManagerFactory factory;
...
HashMap<String, String> dbProperties = new HashMap<String, String>();
dbProperties.put("javax.persistence.jdbc.driver", driver);
dbProperties.put("javax.persistence.jdbc.url", url);
dbProperties.put("javax.persistence.jdbc.user", user);
dbProperties.put("javax.persistence.jdbc.password", password);
dbProperties.put("eclipselink.ddl-generation", "none");
dbProperties.put("eclipselink.ddl-generation.output-mode", "database");
factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME, dbProperties);
EntityManager em = factory.createEntityManager();
...
对于 Oracle,我需要动态设置模式(如果可能的话),而不是在每个实体 class.
的 @Table 注释中进行硬编码目前我使用的是常量(意味着它不是动态的)
@Table(name="MYTABLE", schema = Constants.ORACLE_SCHEMA)
我想用
@Table(name="MYTABLE")
并将架构设置为属性
dbProperties.put(...)
有这样的属性吗?
在我的搜索中,我发现了一个语法可以提供帮助
ALTER SESSION SET CURRENT_SCHEMA=MYSCHEMA
但我不知道如何将它与 EntityManager 结合起来。
我已经询问了所有可用的属性
提前致谢。
我在这个 post 的帮助下找到了解决方案:https://community.oracle.com/thread/2270534?tstart=0
创建EntityManager后通过查询即可:
...
EntityManager em = factory.createEntityManager();
Query query;
em.getTransaction().begin();
query = em.createNativeQuery("ALTER SESSION SET CURRENT_SCHEMA="+schemaName);
query.executeUpdate();
em.getTransaction().commit();
检查当前架构:
query = em.createNativeQuery("SELECT SYS_CONTEXT('USERENV','SESSION_SCHEMA') FROM DUAL");
System.out.println("Current schema: " + query.getResultList());
我不确定这是否能解决您的问题,但一些应用程序服务器供应商可能会使用名为 InitSql 的东西。
它是一个 SQL 语句,在每次成功建立数据库连接时 运行。
我无法在 Java SE 中为 EclipseLink 找到类似的东西,但也许有一个 post 结帐 SQL 可以 运行 像 InitSql
就像 Andreas L. 的回答一样,这可以让您 运行 命令,例如 .
ALTER SESSION SET CURRENT_SCHEMA=xxx