【问题标题】:Get DB schema name in JPA (from EntityManager/EntityManagerFactory) [duplicate]在 JPA 中获取数据库模式名称(来自 EntityManager/EntityManagerFactory)[重复]
【发布时间】:2013-03-12 00:42:21
【问题描述】:

在 JPA (EclipseLink 2.4) 中,我需要在 NativeQuery 中指定模式名称:

EntityManager em = emf.createEntityManager();
Query query = em.createNativeQuery("select foo from bar.table");

以上方法可行,但显然我不喜欢硬编码模式名称,特别是考虑到我已经在 orm.xml 中指定了它:

<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm orm_2_0.xsd"
    version="2.0">
    <persistence-unit-metadata>
        <persistence-unit-defaults>
            <schema>bar</schema>
        </persistence-unit-defaults>
    </persistence-unit-metadata>   
</entity-mappings>

肯定有办法在运行时从某个地方获取模式名称?

【问题讨论】:

  • 这里提出了一个非常相似的问题,可能不是理想的答案:stackoverflow.com/questions/8298058/…
  • 谢谢。虽然有点尴尬,但以下似乎可行:em.unwrap(Session.class).getLogin().getTabl‌​eQualifier()

标签: java jpa eclipselink


【解决方案1】:

如果使用这样的持久性单元:

<?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="">
<persistence-unit name="MY_PU" transaction-type="RESOURCE_LOCAL">
  ...................................
<properties>
  <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://something:5432/MY_DB_NAME"/>
  <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
  <property name="javax.persistence.jdbc.user" value="user"/>
  <property name="javax.persistence.jdbc.password" value="pass"/>
  <property name="eclipselink.logging.level" value="WARNING"/>
</properties>

然后您可以使用 EntityManagerFactory 来提取属性:

public String getDatabaseName() {
    String dbName = null;
    Map<String, Object> map = emf.getProperties();
    String url = (String) map.get("javax.persistence.jdbc.url");
    if(url != null) {
        dbName = url.substring(url.lastIndexOf("/") + 1);
    }
    return dbName;
}

其中 emf 是已经创建的 EntityManagerFactory。

emf = Persistence.createEntityManagerFactory("MY_PU");

【讨论】:

  • P.S.这至少对 SQL Server 不起作用,因为它的 jdbc url 看起来像:jdbc:sqlserver://localhost:1433;databaseName=dbname
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多