Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我可以在创建EntityManager之前设置模式吗?_Java_Oracle_Jpa_Eclipselink_Entitymanager - Fatal编程技术网

Java 我可以在创建EntityManager之前设置模式吗?

Java 我可以在创建EntityManager之前设置模式吗?,java,oracle,jpa,eclipselink,entitymanager,Java,Oracle,Jpa,Eclipselink,Entitymanager,我需要使用具有不同属性的多个持久性单元(在我的例子中是MySQL和Oracle数据库)。在persistence.xml中,我定义了两个不同的“persistence unit”,并仅列出了其中的实体类 属性可以在persitence.xml中使用 … 在创建EntityManager之前,我在java类中执行此操作,因为我必须使用不同的属性(我以前读过): 我想用 @Table(name="MYTABLE") 并将架构设置为属性 dbProperties.put(...) 有这样的财产吗

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

属性可以在persitence.xml中使用

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

我想用

@Table(name="MYTABLE")
并将架构设置为属性

dbProperties.put(...)
有这样的财产吗

在我的搜索中,我找到了一种语法,这可能会有所帮助

ALTER SESSION SET CURRENT_SCHEMA=MYSCHEMA
但我不知道如何将它与EntityManager结合起来

我已经询问了所有可用的属性,但还没有找到任何东西


提前谢谢。

我在这篇文章的帮助下找到了解决方案:

可以在创建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语句,在每个成功的数据库连接上运行

  • 在Weblogic 12c中,这称为
  • 在Tomcat7中,这也称为
我在JavaSE中找不到类似于EclipseLink的东西,但也许有一种签出后SQL可以像InitSql一样运行

就像Andreas L.的回答一样,这可以让您运行如下命令

ALTER SESSION SET CURRENT_SCHEMA=xxx

您不能将模式也绑定到用户,然后根据您想要使用的模式选择用户吗?也许这确实解决了问题,但Tomcat和Weblogic中有一种叫做“InitSql”的东西,允许您在签出数据库连接后运行一些SQL。然后,解决方案是将模式绑定到jdbc池。希望如此helps@Chris每次需要更改架构(因为它在创建EntityManager之后工作)或为每个用户创建不同的EntityManager(?)时,都可以运行查询ALTER SESSION SET CURRENT_SCHEMA。感谢您的回复。我正在使用一个独立的java程序和EclipseLink。如果您有服务器(Tomcat/Weblogic或其他)的示例/解决方案,我也会很感激。@Andreas L.-您可以对会话事件执行相同的操作,并对应用程序隐藏查询,但不应动态更改,因为JPA维护缓存,在entityManager上执行本机查询实际上取决于提供者如何使用和汇集这些连接的内部结构。如果将方案绑定到数据库中的用户,则不需要更改连接上的模式,而是可以将用户指定为属性。
        query = em.createNativeQuery("SELECT SYS_CONTEXT('USERENV','SESSION_SCHEMA') FROM DUAL");
        System.out.println("Current schema: " + query.getResultList());
ALTER SESSION SET CURRENT_SCHEMA=xxx