使用Hibernate连接Oracle 无法识别生成的SQL问题
问题:
在JAVA工程中,数据库使用的是OracleXE(Oracle10g Express Edition)。 使用hibernate.reveng.xml创建了实体类及其DAO类,如:
tt.myutils.dao
|--User.java
|--UserHome.java
|--User.hbm.xml
由于没有JNDI容器,因此对UserHome.java进行了如下修改,使代码能够运行:
protected SessionFactory getSessionFactory() {
try {
Configuration cfg = new Configuration().configure();
Properties p = cfg.getProperties();
StandardServiceRegistryBuilder b = new StandardServiceRegistryBuilder().applySettings(p);
ServiceRegistry sr = b.build();
return cfg.buildSessionFactory(sr);
}
catch (Throwable ex) {
System.out.println("创建SessionFactory时出错!"+ex);
throw new ExceptionInInitializerError(ex);
}
}
主程序也很简单:
package tt; import tt.myutils.dao.User;
import tt.myutils.dao.UserHome; public class Tester { public static void main(String[] args) {
UserHome gh = new UserHome();
User obj = gh.findById("张三");
System.out.println("获取记录信息:" + obj.getPwd());
}
}
调试程序,出现以下“表名无效”错误(也可能是“SQL 命令未正确结束”):

将上述SQL语句输出拷贝到SQL PL下执行,也报同样错误,说明是Hibernate生成的SQL语句语法有问题。
分析:
oracle建表时,如果建表的SQL同时满足以下条件,则不论在查询或新增数据时都必须把相应SQL中的表名用引号括起来,否则会报00942错误。
条件1. 建表的SQL中表名、列名用引号 " 括起来了。
条件2. 建表的SQL中表名中英文字符不全部都是大写。
试用Navcat等工具建立Oracle表时,是必须添加引号的,如Navcat工具生成的脚本:
CREATE TABLE "BIZ"."NewTable" (
"ID" NUMBER(4) NULL ,
"NAME" VARCHAR2(32) NULL ,
"ADDRESS" VARCHAR2(64) NULL
)
NOCOMPRESS
;
也就是说,用工具生成的表,以后ORACLE只识别带 " 的SQL
解决办法:
在User.hbm.xml中解决,靠手工吧:把出现的所有表、列用""括起来。而XML不能直接插入",必须用XML转义符"如下所示:
<hibernate-mapping>
<class name="tt.myutils.dao.User" table=""USER"">
<id name="usr" type="string">
<column name=""USR"" length="30" />
<generator class="assigned" />
</id>
<property name="pwd" type="string">
<column name=""PWD"" length="64" />
</property>
</class>
</hibernate-mapping>
现在,Hibernate输出的SQL语句变成了
select
user0_."USR" as USR1_0_0_,
user0_."PWD" as PWD2_0_0_
from
BIZ."USER" user0_
where
user0_."USR"=?
结果就正确了。
总结:
Oracle的语法搞的鬼。
n
使用Hibernate连接Oracle 无法识别生成的SQL问题的更多相关文章
- 【转】Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句
原文链接:http://www.cnblogs.com/quanyongan/p/3152290.html 最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 ...
- Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句
最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic- ...
- hibernate 连接oracle数据库的配置 (参考)
<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC &qu ...
- hibernate连接Oracle rac
连接方式与普通的数据库不一样.connection.url 中使用了LOAD-BALANCE = yes 要不然会报错 <hibernate-configuration> <sess ...
- hibernate连接oracle
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC & ...
- hibernate 连接 oracle数据库
前言:以下所有的操作都是基于你已经成功安装了oracle数据库并且java的开发环境正常的情况下进行的. 如果没有完善请先配置基础环境. 第一步:配置需要的环境(下载并导入需要的包). 我的百度云盘里 ...
- Hibernate用Oracle的sequence生成自增Id
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBL ...
- hibernate连接oracle12c数据库报:java.sql.SQLException: ORA-01017: 用户名/口令无效; 登录被拒绝。(用户名/口令在oracle客户端以及cmd命令都能登入)
报错信息: 2017-09-22 15:40:07,354 WARN [org.hibernate.cfg.SettingsFactory] - Could not obtain connection ...
- Java笔记8:Hibernate连接Oracle
1下载hibernate-3.6.0 Final.zip到任意目录,解压缩后得到hibernate目录 2下载slf4j-1.7.13.zip到任意目录,解压缩后得到slf4j-1.7.13 3操作数 ...
随机推荐
- 【JDBC】java PreparedStatement操作oracle数据库
************************************************************************ ****原文:blog.csdn.net/clark_ ...
- Qt 的几个核心机制总结之 布局(QWidget可以设置setSizePolicy,而QSizePolicy有Fixed,minimum,maximum,preferred,expanding,ignore等7个属性,还可以横竖分开)
1.Qt布局的作用 Qt的布局是通过布局管理器来实现的,布局管理器负责在父类窗口部件区域构建子窗口部件,使得放置在窗体中的每个窗口部件都有一个适合的大小和位置,并且能够随着应用程序本身的变化而变化从而 ...
- 签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP
原文 签署 Centennial Program Addendum,使用 Desktop Bridge 将 Win32 应用转制成 UWP 能上架 Windows 应用商店的并不一定必须是 UWP 应 ...
- flask-mail发送邮件始终失败
from flask_mail import Mail,Message from flask import Flask import os app=Flask(__name__) app.config ...
- i/o多路复用笔记
1.用户空间和内核空间 操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也可以访问底层硬件设备.为了保护用户进程不能直接操作内核,保证内核的安全,操作系统将虚拟空间划分为两部分, ...
- ubuntu12.04下编译安装x86平台qt库qt-everywhere-opensource-src-4.8.5
本文记录PC(x86)下安装Linux/X11版Qt 开发环境.下载页面:http://qt-project.org/downloads ARM嵌入式版本qt库的编译安装详见<unbunt12. ...
- Delphi内存管理(Integer、Boolean、Record、枚举等都是在作用域内编译器自动申请内存,出了作用域自动释放;另外,字符串、Variant、动态数组、接口也是由Delphi自动管理)
一.什么是堆.栈? 程序需要的内存空间分为 heap(堆) 和 stack(栈),heap 是自由存储区, stack 是自动存储区,使用 heap 需要手动申请.手动释放, stack 是自动申请. ...
- Asp.NET的目的是学习
一.概观 二.具体介绍 1.Request对象 Request对象是用来获取client在请求一个页面或传送一个Form时提供的全部信息.这包含可以标识浏览器和用户的HTTP变量.存储在client的 ...
- WPF实现选项卡效果(2)——动态添加AvalonDock选项卡
原文:WPF实现选项卡效果(2)--动态添加AvalonDock选项卡 简介 在前面一篇文章里面,我们使用AvalonDock实现了类似于VS的选项卡(或者浏览器的选项卡)效果.但是我们是通过xaml ...
- 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例
原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例 用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...