我们设置了开发环境,这样 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 的部署扫描程序更改为串行部署应用程序而不是并行部署应用程序会有多困难。我们也对其他想法持开放态度。