我可以在创建EntityManager之前设置架构吗?

时间:2015-12-09 13:02:18

标签: java oracle jpa eclipselink entitymanager

我需要使用具有不同属性的多重持久性单元(在我的例子中是MySQL和Oracle数据库)。在persistence.xml中,我定义了两个不同的"持久性单元"并且只列出那里的实体类。

可以使用

在persitence.xml中设置属性

<properties> <property name="..." value="..." /> ...

我在创建EntityManager之前在java类中执行它,因为我必须使用不同的属性(我之前读过):

        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,我需要动态设置模式(如果可能),而不是在每个Entity类的@Table注释中进行硬编码。

现在我使用常量(意味着它不是动态的)

@Table(name="MYTABLE", schema = Constants.ORACLE_SCHEMA)

我想用

@Table(name="MYTABLE")

并将架构设置为属性

dbProperties.put(...)

有这样的财产吗?

在我的搜索中,我找到了一个可以提供帮助的语法

ALTER SESSION SET CURRENT_SCHEMA=MYSCHEMA

但我不知道如何将它与EntityManager结合起来。

我已经询问了所有可用的属性here,但还找不到任何内容。

提前谢谢。

2 个答案:

答案 0 :(得分:1)

我不确定这是否能解决您的问题,但是有些应用服务器供应商可能会称之为InitSql。

这是一个在每个成功的数据库连接上运行的SQL语句。

  • 在Weblogic 12c中,这称为InitSql
  • 在Tomcat 7中,这也称为InitSql

我在Java SE中找不到类似这样的EclipseLink,但也许有一个post checkout SQL可以像InitSql一样运行

就像Andreas L.的回答一样,这可以让你运行像。

这样的命令
ALTER SESSION SET CURRENT_SCHEMA=xxx

答案 1 :(得分:0)

我已经在这篇文章的帮助下找到了解决方案: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());