0

我们设置了开发环境,这样 Hibernate 将在每次应用启动时创建一个新的空数据库:

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

这适用于部署在服务器上的单个应用程序,但在我们的开发环境中,我们通常部署连接到同一数据库的多个应用程序。它们都使用来自应用服务器的相同数据源。

问题是当它们在 JBoss AS7 中启动时,它们是并行部署的,因此两个应用服务器都试图同时创建表。我们得到这样的东西(带有匿名的表和列名):

16:07:25,307 错误 [org.hibernate.tool.hbm2ddl.SchemaExport](MSC 服务线程 1-13)不成功:创建表 PUBLIC.SOME_TABLE(SOME_COLUMN varchar(32)不为空,SOME_OTHER_COLUMN 字符不为空,主键(SOME_COLUMN ))
16:07:25,346 错误 [org.hibernate.tool.hbm2ddl.SchemaExport](MSC 服务线程 1-13)表“SOME_TABLE”已存在;SQL 语句:
创建表 PUBLIC.SOME_TABLE (SOME_COLUMN varchar(32) not null, SOME_OTHER_COLUMN char not null, 主键 (SOME_COLUMN)) [42101-161]

这些错误被忽略,服务器最终启动,但我们想知道是否有一些方法可以避免这个问题。我们已经讨论过创建一个应用程序,该应用程序的部署只是为了执行 create-drop 并强制其他应用程序等待,但我们不确定将 JBoss 的部署扫描程序更改为串行部署应用程序而不是并行部署应用程序会有多困难。我们也对其他想法持开放态度。

4

1 回答 1

0

在开发环境中,每个部署的应用程序都应该有自己的数据库架构。这不仅可以解决问题,还可以解决以下问题:

  • 两个开发人员正在执行一些测试,其中一个失败,因为另一个修改了第一个使用的数据
  • 一位开发人员正在开发需要更改架构的演进,而另一位开发人员修复了当前架构上的错误

而且我敢肯定还有很多其他情况会导致问题。让每个开发人员都有自己的架构,一切都会容易得多。

于 2012-05-04T22:16:52.397 回答