OpenXava对接Oracle时实体保留字字段导致数据库生成错误如何解决
解决方案
根因说明
comment、date都属于Oracle的内置保留字,即使配置了正确的Oracle方言,Hibernate默认也不会自动对保留字标识符添加引号,因此会导致DDL执行报错。你修改OpenXava IDE自带的框架源码不生效,是因为框架核心实体以预编译class的形式存放在依赖jar包中,修改的源码文件不会被加载到项目运行时classpath。
1. 全局通用解决方案(推荐,一次性解决所有保留字冲突)
直接修改项目中Hibernate的全局配置,自动给所有标识符加引号:
- 打开项目路径下的
src/main/resources/META-INF/persistence.xml - 在
<properties>标签块中添加如下两行配置:
<property name="hibernate.globally_quoted_identifiers" value="true"/> <property name="hibernate.globally_quoted_identifiers_skip_column_definitions" value="false"/>
配置完成后清空项目编译缓存、删除target目录后重启项目即可,该配置对框架自带的DiscussionComment、演示实体YourFirstEntity以及你自定义的所有实体都生效。
2. 单独调整指定实体的映射(无需全局修改配置)
如果不需要全局开启引号,可单独针对冲突实体做映射覆盖:
针对DiscussionComment实体
在你自己的项目中新建和框架原实体全类名一致的类,用@AttributeOverride注解覆盖列映射:
package org.openxava.discussion.model; // 和框架原实体包名完全一致 import javax.persistence.*; @Entity @AttributeOverride( name = "comment", column = @Column(name = "\"COMMENT\"") // 加引号适配保留字,也可自定义为非保留字列名如COMMENT_CONTENT ) public class DiscussionComment extends org.openxava.discussion.model.DiscussionComment { // 无需额外编写属性或方法,直接继承原有逻辑 }
OpenXava运行时会优先加载你项目中自定义的这个实体类,覆盖框架默认的映射规则。
针对YourFirstEntity演示实体
直接修改项目中YourFirstEntity.java的字段注解即可:
// 加引号适配保留字,也可自定义为非保留字列名如CREATE_DATE @Column(name = "\"DATE\"") private Date date;
内容的提问来源于stack exchange,提问作者Gustavo
相关产品推荐
相关产品推荐

