【问题标题】:Hibernate entity manager looking for tables in different schemasHibernate 实体管理器在不同的模式中寻找表
【发布时间】:2013-11-19 11:18:01
【问题描述】:

我正在 java web 项目中使用 hiberante-entity 管理器实现 jpa 持久性。 我在 persistence.xml 中设置了以下属性。

<property name="hibernate.hbm2ddl.auto" value="update"/>

我为每个用户都有一个架构。例如,我有一个用户 1 的模式和一个用户 2 的模式。 如果表 'ABC' 存在于 user1 架构中但不在 user2 架构中,并且我部署了应用程序并且它使用 user2 db 凭据,我会收到消息 'user1.ABC' table found 所以在 user2 中没有创建 'ABC' 表架构。

当我尝试在 persistence.xml 文件中使用以下属性时,表是在 user2 架构中创建的。

 <property name="hibernate.hbm2ddl.auto" value="create"/>   

我的问题是 如果应用程序正在使用 user2 db 凭据,为什么 hibernate 在另一个模式中搜索,即 user1?和 我不想在每次服务器启动时都创建架构,所以我怎样才能避免使用 价值“创造”。

编辑:下面是我的 persistence.xml 文件

    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="XXXXXX" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <class>org.axonframework.saga.repository.jpa.SagaEntry</class>
    <class>org.axonframework.saga.repository.jpa.AssociationValueEntry</class>

    <properties>
        <property name="hibernate.archive.autodetection" value="class"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/> 
    </properties>
</persistence-unit>
</persistence>

提前致谢

【问题讨论】:

  • 你能发布你的完整 persistence.xml 吗?
  • 您也可以发布org.axonframework.saga.repository.jpa.SagaEntry。可能您正在那里定义架构,因此无论获取哪个数据库凭据,它都是默认的

标签: java hibernate jpa


【解决方案1】:

我也遇到了同样的问题,挖了好久才知道这个bug和Mysql Connector有关。 将 MySql 连接器 6.0.5 更改为 5.1.28 后它对我来说很好。 我希望它可以帮助你。干杯

【讨论】:

    【解决方案2】:

    有同样的问题。 设置&lt;property name="hibernate.default_schema" value="MY_SCHEMA"/&gt;后问题就解决了。

    【讨论】:

      【解决方案3】:

      检查您是否在 Hibernate Sessionfactory 中调用 user1 和 user2。

      【讨论】:

      • 在我的情况下,只有一个用户(没有多租户),行为与作者描述的相同。
      • @Scadge 具有多个模式隐含地意味着多租户。每个架构都被视为一个租户。
      【解决方案4】:

      如果您想正确处理several schemas,请使用multi-tenant per schema,如果您想更新/创建/迁移/处理columns/tables/schemas/databases,请使用flywayliquibase

      参考文献

      多租户https://vladmihalcea.com/hibernate-database-schema-multitenancy/

      飞路https://flywaydb.org

      Liquibasehttps://www.liquibase.org

      【讨论】:

      • 在我的情况下,没有多租户 - 只有一个用户和特定数据库的连接字符串,但 hbm2ddl 不是在这个数据库中创建一个表,而是在另一个模式中更新一个似乎有同名。
      • @Scadge,请不要劫持别人的问题来问你自己的问题。
      【解决方案5】:

      Hibernate 文档对此很清楚,您需要启用多租户操作as described in this answerthis example

      基本上,您必须声明多个持久性单元并让每个单元指向不同的模式。然后,每个人也可以使用不同的登录凭据。

      Hibernate documentation link

      总结一下:

      1. 定义您的持久性单元
      2. 为每个持久性单元定义映射文件

      使用 JPA 时添加以下内容: 3. 从 SessionFactory 指定租户标识符 4. 实现一个 MultiTenantConnectionProvider

      【讨论】:

        猜你喜欢
        • 2017-05-31
        • 2014-09-06
        • 2013-10-13
        • 2011-08-22
        • 2016-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-01
        相关资源
        最近更新 更多