【问题标题】:JPA + Hibernate + MySQL: How to propagate a schema into the connection?JPA + Hibernate + MySQL:如何将模式传播到连接中?
【发布时间】:2019-05-23 06:26:52
【问题描述】:

我的应用程序中有几个独立的组件。每个数据库模式中都有自己的数据模型:

@Entity
@Table(name = "sample")  // the table name is not unique among components (schemas)
public class SampleEntity1 { ... }

类似SampleEntity2

每个组件都有自己的persistence-unitX.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 https://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
    <persistence-unit name="unit1" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <mapping-file>META-INF/orm-unit1.xml</mapping-file>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
        </properties>
        <class>com.example.model1.SampleEntity1</class>
    </persistence-unit>
</persistence>

而映射文件orm-unitX.xml 设置架构:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0" xmlns="http://java.sun.com/xml/ns/persistence/orm">
    <persistence-unit-metadata>
        <persistence-unit-defaults>
            <schema>schema1</schema>
        </persistence-unit-defaults>
    </persistence-unit-metadata>
</entity-mappings>

类比其他组件。

为了使其正常工作,我希望有一个没有数据库部分的连接字符串,例如:jdbc:mysql://127.0.0.1:3306

不幸的是,这样的设置会引发异常:

java.sql.SQLException: 未选择数据库

将数据库(架构)设置到连接字符串(例如:jdbc:mysql://127.0.0.1:3306/myschema)不会引发异常,但不会按预期工作 - 仅使用一个架构,并且具有相同表名的实体被合并到单个数据库中表。

设置属性hibernate.default_schema 也不行。

有没有办法将 JPA 模式设置传播到与 Hibernate 和 MySQL 的数据库连接中?


我正在使用 Spring Data (Spring Boot Data-Jpa starter 2.1.5.RELEASE) 和 MySQL 8 - 应该没有任何影响。

当使用 EclipseLink 而不是 Hibernate 时,整个场景都有效,所以问题似乎出在 Hibernate 中。

Here 是一个示例项目。

【问题讨论】:

  • 我们在这里不这样做 :P --> callicoder.com/…
  • @emotionlessbananas ???
  • 不,因为对于 MySQL,这不是模式而是数据库。这意味着它是数据库连接中的必需部分。您在哪里创建数据源?
  • @SimonMartinelli 我明白,但对于 mysql 来说,schema is a synonym of database。没有数据库的连接字符串提供到服务器的连接,然后应该可以选择要使用的数据库(use mydb)。整个场景在使用 EclipseLink 而不是 Hibernate 时有效,所以问题一定出在 Hibernate 上。
  • 哦,我明白了。对不起。看我的回答。

标签: java mysql spring hibernate jpa


【解决方案1】:

对于 Hibernate 和 MySQL,您必须在 orm.xml 中使用目录而不是模式:

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings version="2.0" xmlns="http://java.sun.com/xml/ns/persistence/orm">
    <persistence-unit-metadata>
        <persistence-unit-defaults>
            <catalog>schema1</catalog>
        </persistence-unit-defaults>
    </persistence-unit-metadata>
</entity-mappings>

来自文档:http://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html

@Table 注释的模式属性仅在 底层数据库支持模式(例如 PostgreSQL)。

因此,如果您使用的是不支持的 MySQL 或 MariaDB 本地模式(模式只是目录的别名),您需要 使用目录属性,而不是模式之一。

【讨论】:

  • 确实有效,非常感谢!是否有任何文档解释这一点?
  • 我用文档链接更新了我的答案。您能否接受我的回答作为正确答案。谢谢
猜你喜欢
  • 2015-04-14
  • 2018-10-20
  • 2018-09-30
  • 2019-05-10
  • 2019-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
相关资源
最近更新 更多