Hibernate实体管理器在查找不同模式的表。

6
我正在一个Java Web项目中使用Hibernate实体管理器实现JPA持久化。我在persistence.xml文件中设置了以下属性: <property name="hibernate.hbm2ddl.auto" value="update"/> 每个用户都有一个模式。例如,我有一个用户1的模式和一个用户2的模式。如果表"ABC"存在于用户1的模式中,但不存在于用户2的模式中,并且我部署应用程序并使用用户2的数据库凭据,则会出现消息"user1.ABC"表已找到,因此"ABC"表不会在用户2的模式中创建。
当我在persistence.xml文件中使用以下属性时,该表将在用户2的模式中创建。
 <property name="hibernate.hbm2ddl.auto" value="create"/>   

我的问题是,为什么当应用程序使用user2数据库凭据时,Hibernate在另一个模式即user1中搜索?我不想每次启动服务器时都创建模式,那么如何避免使用值“create”。

编辑:以下是我的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文件吗? - Sandhu Santhakumar
你能同时发布 org.axonframework.saga.repository.jpa.SagaEntry 吗?可能你正在那里定义模式,所以无论选择哪个数据库凭据,它都是默认的。 - AntJavaDev
5个回答

3

我也遇到了同样的问题,经过一番搜索,发现这个问题与Mysql连接器相关。 将MySql Connector从6.0.5更改为5.1.28后,问题得到了解决。 希望可以对你有所帮助。祝好!


0

遇到了同样的问题。 设置 <property name="hibernate.default_schema" value="MY_SCHEMA"/> 后,问题得到解决。


0

在我的情况下,没有多租户 - 只有一个单一的用户和连接字符串到特定的数据库,但是 hbm2ddl 不是在这个数据库中创建表,而是更新另一个模式中具有相同名称的表。 - Scadge
@Scadge,请不要利用别人的问题来提出你自己的问题。 - jwenting

0

Hibernate文档明确指出,您需要启用多租户操作如此答案所述此示例

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

Hibernate文档链接

总结:

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

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


0

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


在我的情况下,只有一个用户(没有多租户),行为与作者描述的相同。 - Scadge
@Scadge 拥有多个模式意味着隐含着多租户。每个模式被视为一个租户。 - jwenting

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接