部署在Weblogic 12的Grails应用启动时未自动创建新增domain类对应表
Grails 2.2.3 部署Weblogic 12新增Domain类不自动建表解决方案
核心触发原因
该问题的根本差异来源于Weblogic服务器与本地IDEA运行环境的类加载机制、权限配置差异,即使Hibernate配置完全一致也会触发异常。
逐一排查修复方案
类加载冲突修复
Weblogic 12内置的JPA、Hibernate实现版本与Grails 2.2.3依赖的Hibernate版本不兼容,默认情况下Weblogic会优先加载服务器内置的依赖包,导致Domain类扫描逻辑异常,仅能识别到首次部署时已存在的Domain,无法识别后续新增的Domain。
解决方案:在应用的WEB-INF目录下新增weblogic.xml配置,指定优先加载应用自身的依赖包:<?xml version="1.0" encoding="UTF-8"?> <weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> <container-descriptor> <prefer-application-packages> <package-name>org.hibernate.*</package-name> <package-name>javax.persistence.*</package-name> <package-name>org.codehaus.groovy.grails.orm.hibernate.*</package-name> <package-name>antlr.*</package-name> </prefer-application-packages> </container-descriptor> </weblogic-web-app>数据库权限校验
已有表的结构变更仅需要数据库用户的ALTER权限,新增表需要额外的CREATE TABLE、CREATE SEQUENCE权限(Grails 2.x默认用序列生成主键)。本地开发使用的数据库用户通常权限较高,而Weblogic数据源配置的生产用户可能仅开放了ALTER权限,未开放建表权限。
解决方案:用Weblogic配置的数据源账号登录Oracle,执行以下语句验证权限:
若无对应权限,联系DBA授权即可。SELECT * FROM USER_SYS_PRIVS WHERE PRIVILEGE IN ('CREATE TABLE', 'CREATE SEQUENCE');打包与扫描配置校验
- 解压打包好的WAR包,检查
WEB-INF/classes目录下是否存在新增Domain类对应的.class文件,排除打包环节遗漏文件的问题 - 在
grails-app/conf/DataSource.groovy的生产环境配置段,显式指定Domain类的扫描包路径,避免Weblogic类加载环境下扫描范围异常:
environments { production { dataSource { dbCreate = "update" // 确认此处配置为update而非validate // 其余数据源配置保留 hibernate { entityPackages = ['替换为你的项目Domain类所在的根包,比如com.xxx.xxx.domain'] } } } }- 解压打包好的WAR包,检查
配置覆盖排查
检查Weblogic部署时是否指定了外部配置文件、JNDI数据源附带了额外的Hibernate配置,覆盖了WAR包内的dbCreate属性,若dbCreate被覆盖为validate就只会校验表结构不会自动建表。
内容的提问来源于stack exchange,提问作者Matin Ghiasvand
相关产品推荐
相关产品推荐

