问题:

在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="&quot;USER&quot;">
<id name="usr" type="string">
<column name="&quot;USR&quot;" length="30" />
<generator class="assigned" />
</id>
<property name="pwd" type="string">
<column name="&quot;PWD&quot;" 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问题的更多相关文章

  1. 【转】Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    原文链接:http://www.cnblogs.com/quanyongan/p/3152290.html 最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和  ...

  2. Hibernate利用@DynamicInsert和@DynamicUpdate生成动态SQL语句

    最近在使用Hibernate4中,发现两个很有奥秘的注解 @DynamicInsert 和 @DynamicUpdate 如果是在配置文件的话那就是dynamic -insert 和 dynamic- ...

  3. hibernate 连接oracle数据库的配置 (参考)

    <?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configuration PUBLIC          &qu ...

  4. hibernate连接Oracle rac

    连接方式与普通的数据库不一样.connection.url 中使用了LOAD-BALANCE = yes 要不然会报错 <hibernate-configuration> <sess ...

  5. hibernate连接oracle

    <?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC           & ...

  6. hibernate 连接 oracle数据库

    前言:以下所有的操作都是基于你已经成功安装了oracle数据库并且java的开发环境正常的情况下进行的. 如果没有完善请先配置基础环境. 第一步:配置需要的环境(下载并导入需要的包). 我的百度云盘里 ...

  7. Hibernate用Oracle的sequence生成自增Id

    <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBL ...

  8. 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 ...

  9. Java笔记8:Hibernate连接Oracle

    1下载hibernate-3.6.0 Final.zip到任意目录,解压缩后得到hibernate目录 2下载slf4j-1.7.13.zip到任意目录,解压缩后得到slf4j-1.7.13 3操作数 ...

随机推荐

  1. 允许Android对于飞行模拟器

    Android模拟器是公认的慢,并且不是一般的慢,即使在高性能的PC上,跟开发环境没关系,由于它就是慢.可是我们又必须使用模拟器,比方在測试Android不同版本号的兼容性时,或者在測试不同屏幕尺寸的 ...

  2. CSS(网页样式语言)基础

    所谓全栈,个体可以独立地完成系统的设计.开发.测试.部署以及运维.打通一个领域从无到有的全过程. 为什么会有 markdown 文本编辑显示工具呢,因为 html 太重了.markdown 是 htm ...

  3. 关于QWidget和QDialog窗体居中的问题(必须要setFixedSize设初始值大小,否则没法居中)

    最近开发中,遇到了窗体不能居中的问题,看了网上的很多文章,窗口居中,无非都是move至窗口的中心目标; 有两种方式, 一种在构造函数中直接计算中心坐标; 另一种是在窗口show后再move至相应坐标. ...

  4. Android 调用系统分享文字、图片、文件,可直达微信、朋友圈、QQ、QQ空间、微博

    原文:Android 调用系统分享文字.图片.文件,可直达微信.朋友圈.QQ.QQ空间.微博 兼容SDK 18以上的系统,直接调用系统分享功能,分享文本.图片.文件到第三方APP,如:微信.QQ.微博 ...

  5. OpenGL(三) RGBA颜色设置

    OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 像素点附加颜色信息之后,就必须为每一个像素点额外分配一个内存空间保存该点的颜色信息,对于RGBA颜色模式,保存的数据直接代表了颜色, ...

  6. IOS status bar

    从iOS7开始,该系统提供2样的管理风格状态栏 由UIViewController管理(每UIViewController我们可以有各自不同的状态栏) 由UIApplication管理(由其统一管理的 ...

  7. Python科学计算(两)——时域波形和正弦信号的频谱

    Python科学计算(两)-- 时域和频域波形为正弦波形信号生成.计算和显示 # -*- coding: utf-8 -*- import numpy as np import matplotlib. ...

  8. 早期malloc分配时,如果内存耗尽分配不出来,会直接返回NULL。现在分配不出来,直接抛出异常(可使用nothrow关键字)

    今天和同事review代码时,发现这样的一段代码: Manager * pManager = new Manager(); if(NULL == pManager) { //记录日志 return f ...

  9. You don't have permission to access / on this server问题的解决.

    vhosts.conf配置文件中虚拟主机的配置如下,Options Indexes FollowSymLinks 后面添加 ExecCGI <VirtualHost 192.168.10.82: ...

  10. 赵伟国辞去TCL集团董事等职位,紫光参与TCL定增浮盈已超7亿

    集微网消息,TCL 集团于8月9日晚间发布公告称,公司董事会于近日收到董事赵伟国先生的书面辞职报告,赵伟国先生因个人原因申请辞去公司董事及公司战略委员会委员职务.辞任后,赵伟国先生不再担任公司任何职务 ...