多个 JPA 持久性单元指向同一个数据库?

Posted

技术标签:

【中文标题】多个 JPA 持久性单元指向同一个数据库?【英文标题】:Multiple JPA persistence units pointing to same database? 【发布时间】:2011-04-22 16:17:21 【问题描述】:

我们可以有多个 JPA 持久单元指向同一个数据库,在不同的 Java 项目中并同时部署在服务器上吗?我的意思是同一时间,不是在同一秒部署,而是一起部署。我正在使用 hsqldb 数据库。

我的项目有一个客户端-服务器模型。我有一个统一的数据库表,服务器在其中填充数据,然后客户端在不同的项目中访问该数据。我可以通过服务器成功填充数据库。但是当我部署客户端项目时,数据库中的所有数据都会被删除。

我将<property name="hibernate.hbm2ddl.auto" value="update" /> 用于两个持久性单元。

【问题讨论】:

【参考方案1】:

我们可以有多个 JPA 持久化单元指向同一个数据库,在不同的 Java 项目中并同时部署在服务器上吗?

只要您在两个项目中都没有不兼容的映射,这应该可以工作。但是,您将无法使用二级缓存。

但是当我部署客户端项目时,数据库中的所有数据都会被删除。 (...)

hbm2ddl.auto 设置为update 时,这并不是我所期望的行为,但我不知道在“类集群”环境中使用时该行为是否定义良好(多个 JVM 执行更新)在同一时间)。

在服务器部分完成初始化后部署客户端时会发生什么?

我的建议:

设置日志以查看确切发生了什么 如果您共享相同的实体,请不要在客户端和服务器上update(尽管如果一个接一个地这样做应该不会有问题)。 最终,don't use update at all on production database。

【讨论】:

您的意思是只部署客户端并取消部署服务器? @Vashishtha 不,我的意思是部署客户端和服务器,但只有在模式更新完成后。 @Pascal 我正在做同样的事情。但它不起作用:( @Vashishtha 很抱歉,但“它不起作用”并没有说明问题。按照建议激活日志记录,解释你做了什么或改变了什么,当前的结果是什么。 @Pascal 抱歉含糊不清。我做了以下事情:1)启用日志记录2)部署服务器,然后部署客户端。在日志中,我在启动服务器时看到了插入语句。但是当我启动客户端时,服务器的持久化单元被取消部署,然后客户端的持久化单元被部署,清除了数据库中的所有数据。

以上是关于多个 JPA 持久性单元指向同一个数据库?的主要内容,如果未能解决你的问题,请参考以下文章

将实体分配给持久性单元(spring-boot,spring-data-jpa)

persistence.xml 中的多个持久性单元相互创建表

在jpa中将持久性上下文设置为只读

持久化单元不是持久化的

JPA集合映射

Atomikos:事务包含多个持久化时的异常