【发布时间】: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