当前位置:编程学习 > JAVA >>

太奇怪了。hibernate问题

我要是插入的没有汉字就没问题,一但有汉字就执行hql语句后没反应。。感觉像是到那就死循环了。。

public String updateCommoditType(CommoditType commoditType) {
String result="ok";
try {
super.getHibernateTemplate().update(commoditType);//走到这里就不往下走了。。感觉像是死循环了。如果没有汉字就一切正常
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}

return result;
}







也不报错。。

Hibernate: insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values (?, ?, ?)
Hibernate: update SCOTT.COMMODITYTYPE set NAME=?, TOPID=? where ID=?

HQL语句正常打印到控制台。。可是数据没有到数据库,而且到那也不往下执行。。
因为我是ajax请求。所以我前台回调函数也不执行。
如果我插入,或者修改的数据没有汉字就一切正常,,有汉字就这样。。哪的问题??
而且捕捉不到错误。。。。。。。。。。
数据库用的是oracle
下面是实体类映射文件。。
<class name="com.bean.CommoditType" table="COMMODITYTYPE" schema="SCOTT">
        <id name="id" type="java.lang.String">
            <column name="ID" length="32" />
            <generator class="uuid"></generator>
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" length="50" not-null="true" />
        </property>
        <property name="topid" type="java.lang.String">
            <column name="TOPID" length="32" not-null="true" />
        </property> hibernate hql ajax --------------------编程问答-------------------- 你可以在updateCommoditType方法里new一个CommoditType 的实例,然后手动set NAME, TOPID, ID这三个属性,name你写中文的,然后用update()更新这个测试的实例,看看结果如何? --------------------编程问答--------------------
引用 1 楼 liangxiaobu 的回复:
你可以在updateCommoditType方法里new一个CommoditType 的实例,然后手动set NAME, TOPID, ID这三个属性,name你写中文的,然后用update()更新这个测试的实例,看看结果如何?




public String updateCommoditType(CommoditType commoditType) {
String result="ok";
commoditType.setId("a1s2d5f4e8w9q6a3");
commoditType.setName("我是测试");//用这句就是不进数据库也不好使
                //commoditType.setName("1a12131415"); 用这句就可以进数据库一切正常
commoditType.setTopid("0000");
try {
super.getHibernateTemplate().update(commoditType);
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}

return result;
}



我这么写的。结果还是一样。。数据库一样没有数据。。。。 --------------------编程问答-------------------- 应该是编码的问题,有可能数据库端或者你打印下你的sql 。 --------------------编程问答--------------------
引用 3 楼 rui888 的回复:
应该是编码的问题,有可能数据库端或者你打印下你的sql 。


Hibernate: insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values (?, ?, ?)
Hibernate: update SCOTT.COMMODITYTYPE set NAME=?, TOPID=? where ID=?


打印了。。看着没啥问题。。而且我带入的值没有汉字就可以使用。。
  有汉字就没反应。。这个问题出在哪? --------------------编程问答--------------------
引用 2 楼 u010617014 的回复:
Quote: 引用 1 楼 liangxiaobu 的回复:

你可以在updateCommoditType方法里new一个CommoditType 的实例,然后手动set NAME, TOPID, ID这三个属性,name你写中文的,然后用update()更新这个测试的实例,看看结果如何?




public String updateCommoditType(CommoditType commoditType) {
String result="ok";
commoditType.setId("a1s2d5f4e8w9q6a3");
commoditType.setName("我是测试");//用这句就是不进数据库也不好使
                //commoditType.setName("1a12131415"); 用这句就可以进数据库一切正常
commoditType.setTopid("0000");
try {
super.getHibernateTemplate().update(commoditType);
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}

return result;
}



我这么写的。结果还是一样。。数据库一样没有数据。。。。


那你直接在数据库COMMODITYTYPE这个表里插入name为中文的记录行么?
用你hibernate打印的insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ("测试", "0000", "a1s2d5f4e8w9q6a3");这句sql在数据库查询器中输入试试

--------------------编程问答--------------------
引用 5 楼 liangxiaobu 的回复:
Quote: 引用 2 楼 u010617014 的回复:

Quote: 引用 1 楼 liangxiaobu 的回复:

你可以在updateCommoditType方法里new一个CommoditType 的实例,然后手动set NAME, TOPID, ID这三个属性,name你写中文的,然后用update()更新这个测试的实例,看看结果如何?




public String updateCommoditType(CommoditType commoditType) {
String result="ok";
commoditType.setId("a1s2d5f4e8w9q6a3");
commoditType.setName("我是测试");//用这句就是不进数据库也不好使
                //commoditType.setName("1a12131415"); 用这句就可以进数据库一切正常
commoditType.setTopid("0000");
try {
super.getHibernateTemplate().update(commoditType);
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}

return result;
}



我这么写的。结果还是一样。。数据库一样没有数据。。。。


那你直接在数据库COMMODITYTYPE这个表里插入name为中文的记录行么?
用你hibernate打印的insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ("测试", "0000", "a1s2d5f4e8w9q6a3");这句sql在数据库查询器中输入试试




完全没有问题插入成功。。而且我数据库里面的测试数据就是中文的。
insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ('测试', '0000', 'a1s2d5f4e8w9q6a3'); --------------------编程问答--------------------
引用 6 楼 u010617014 的回复:
Quote: 引用 5 楼 liangxiaobu 的回复:

Quote: 引用 2 楼 u010617014 的回复:

Quote: 引用 1 楼 liangxiaobu 的回复:

你可以在updateCommoditType方法里new一个CommoditType 的实例,然后手动set NAME, TOPID, ID这三个属性,name你写中文的,然后用update()更新这个测试的实例,看看结果如何?




public String updateCommoditType(CommoditType commoditType) {
String result="ok";
commoditType.setId("a1s2d5f4e8w9q6a3");
commoditType.setName("我是测试");//用这句就是不进数据库也不好使
                //commoditType.setName("1a12131415"); 用这句就可以进数据库一切正常
commoditType.setTopid("0000");
try {
super.getHibernateTemplate().update(commoditType);
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}

return result;
}



我这么写的。结果还是一样。。数据库一样没有数据。。。。


那你直接在数据库COMMODITYTYPE这个表里插入name为中文的记录行么?
用你hibernate打印的insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ("测试", "0000", "a1s2d5f4e8w9q6a3");这句sql在数据库查询器中输入试试




完全没有问题插入成功。。而且我数据库里面的测试数据就是中文的。
insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ('测试', '0000', 'a1s2d5f4e8w9q6a3');


很有可能是驱动问题,是不是其它表也插不了中文? --------------------编程问答--------------------
引用 7 楼 liangxiaobu 的回复:
Quote: 引用 6 楼 u010617014 的回复:

Quote: 引用 5 楼 liangxiaobu 的回复:

Quote: 引用 2 楼 u010617014 的回复:

Quote: 引用 1 楼 liangxiaobu 的回复:

你可以在updateCommoditType方法里new一个CommoditType 的实例,然后手动set NAME, TOPID, ID这三个属性,name你写中文的,然后用update()更新这个测试的实例,看看结果如何?




public String updateCommoditType(CommoditType commoditType) {
String result="ok";
commoditType.setId("a1s2d5f4e8w9q6a3");
commoditType.setName("我是测试");//用这句就是不进数据库也不好使
                //commoditType.setName("1a12131415"); 用这句就可以进数据库一切正常
commoditType.setTopid("0000");
try {
super.getHibernateTemplate().update(commoditType);
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}

return result;
}



我这么写的。结果还是一样。。数据库一样没有数据。。。。


那你直接在数据库COMMODITYTYPE这个表里插入name为中文的记录行么?
用你hibernate打印的insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ("测试", "0000", "a1s2d5f4e8w9q6a3");这句sql在数据库查询器中输入试试




完全没有问题插入成功。。而且我数据库里面的测试数据就是中文的。
insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ('测试', '0000', 'a1s2d5f4e8w9q6a3');


很有可能是驱动问题,是不是其它表也插不了中文?


我就这一个表。。可是能插入英文那么中文也应该没问题啊。。是不是哪个位置有字符编码的错误?需要在哪设置编码。。。。。  数据到后台也没有乱码。应该是通过hibernate插入到数据库的时候出现问题。那么在哪能看到这个错误呢? --------------------编程问答--------------------
引用 8 楼 u010617014 的回复:
Quote: 引用 7 楼 liangxiaobu 的回复:

Quote: 引用 6 楼 u010617014 的回复:

Quote: 引用 5 楼 liangxiaobu 的回复:

Quote: 引用 2 楼 u010617014 的回复:

Quote: 引用 1 楼 liangxiaobu 的回复:

你可以在updateCommoditType方法里new一个CommoditType 的实例,然后手动set NAME, TOPID, ID这三个属性,name你写中文的,然后用update()更新这个测试的实例,看看结果如何?




public String updateCommoditType(CommoditType commoditType) {
String result="ok";
commoditType.setId("a1s2d5f4e8w9q6a3");
commoditType.setName("我是测试");//用这句就是不进数据库也不好使
                //commoditType.setName("1a12131415"); 用这句就可以进数据库一切正常
commoditType.setTopid("0000");
try {
super.getHibernateTemplate().update(commoditType);
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}

return result;
}



我这么写的。结果还是一样。。数据库一样没有数据。。。。


那你直接在数据库COMMODITYTYPE这个表里插入name为中文的记录行么?
用你hibernate打印的insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ("测试", "0000", "a1s2d5f4e8w9q6a3");这句sql在数据库查询器中输入试试




完全没有问题插入成功。。而且我数据库里面的测试数据就是中文的。
insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ('测试', '0000', 'a1s2d5f4e8w9q6a3');


很有可能是驱动问题,是不是其它表也插不了中文?


我就这一个表。。可是能插入英文那么中文也应该没问题啊。。是不是哪个位置有字符编码的错误?需要在哪设置编码。。。。。  数据到后台也没有乱码。应该是通过hibernate插入到数据库的时候出现问题。那么在哪能看到这个错误呢?


你把你数据库服务端的字符集改成utf-8试试 --------------------编程问答--------------------
引用 9 楼 liangxiaobu 的回复:
Quote: 引用 8 楼 u010617014 的回复:

Quote: 引用 7 楼 liangxiaobu 的回复:

Quote: 引用 6 楼 u010617014 的回复:

Quote: 引用 5 楼 liangxiaobu 的回复:

Quote: 引用 2 楼 u010617014 的回复:

Quote: 引用 1 楼 liangxiaobu 的回复:

你可以在updateCommoditType方法里new一个CommoditType 的实例,然后手动set NAME, TOPID, ID这三个属性,name你写中文的,然后用update()更新这个测试的实例,看看结果如何?




public String updateCommoditType(CommoditType commoditType) {
String result="ok";
commoditType.setId("a1s2d5f4e8w9q6a3");
commoditType.setName("我是测试");//用这句就是不进数据库也不好使
                //commoditType.setName("1a12131415"); 用这句就可以进数据库一切正常
commoditType.setTopid("0000");
try {
super.getHibernateTemplate().update(commoditType);
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}

return result;
}



我这么写的。结果还是一样。。数据库一样没有数据。。。。


那你直接在数据库COMMODITYTYPE这个表里插入name为中文的记录行么?
用你hibernate打印的insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ("测试", "0000", "a1s2d5f4e8w9q6a3");这句sql在数据库查询器中输入试试




完全没有问题插入成功。。而且我数据库里面的测试数据就是中文的。
insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ('测试', '0000', 'a1s2d5f4e8w9q6a3');


很有可能是驱动问题,是不是其它表也插不了中文?


我就这一个表。。可是能插入英文那么中文也应该没问题啊。。是不是哪个位置有字符编码的错误?需要在哪设置编码。。。。。  数据到后台也没有乱码。应该是通过hibernate插入到数据库的时候出现问题。那么在哪能看到这个错误呢?


你把你数据库服务端的字符集改成utf-8试试



这个字符集怎么改? --------------------编程问答-------------------- http://blog.csdn.net/tianlesoftware/article/details/4915223
看这个吧 --------------------编程问答-------------------- 照你们这么说,这跟数据库是没有关系的。
程序有问题,看看你hibernate用的是什么方言?
是不是和数据库相配? --------------------编程问答--------------------
引用 12 楼 u010684923 的回复:
照你们这么说,这跟数据库是没有关系的。
程序有问题,看看你hibernate用的是什么方言?
是不是和数据库相配?


如果不匹配的话。那么我插入非中文的时候也应该是失败啊。。
可是只有插入中文的时候是不行的。。 --------------------编程问答--------------------
引用 13 楼 u010617014 的回复:
Quote: 引用 12 楼 u010684923 的回复:

照你们这么说,这跟数据库是没有关系的。
程序有问题,看看你hibernate用的是什么方言?
是不是和数据库相配?


如果不匹配的话。那么我插入非中文的时候也应该是失败啊。。
可是只有插入中文的时候是不行的。。

注意方言,数据库是有言的。
还是换个言试吧,我认为问题是在选择方言上有问题。 --------------------编程问答--------------------
引用 14 楼 u010684923 的回复:
Quote: 引用 13 楼 u010617014 的回复:

Quote: 引用 12 楼 u010684923 的回复:

照你们这么说,这跟数据库是没有关系的。
程序有问题,看看你hibernate用的是什么方言?
是不是和数据库相配?


如果不匹配的话。那么我插入非中文的时候也应该是失败啊。。
可是只有插入中文的时候是不行的。。

注意方言,数据库是有言的。
还是换个言试吧,我认为问题是在选择方言上有问题。



这个东西在哪设置?以前没弄过这个。 --------------------编程问答-------------------- 楼上正解,我当初出现过这个问题。一模一样,就是方言问题。重新检查一下配置。 --------------------编程问答--------------------
引用 15 楼 u010617014 的回复:
这个东西在哪设置?以前没弄过这个。



在hibernate.cfg.xml里面

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property> 

上面是mysql的断言,看看你的设置是对的不? --------------------编程问答-------------------- <session-factory>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<mapping resource="com/ht/bean/CommoditType.hbm.xml" />
</session-factory>
我设置的是oracle啊。。不过我的是11G这个应该兼容吧? --------------------编程问答--------------------
引用 17 楼 FishOfThink 的回复:
Quote: 引用 15 楼 u010617014 的回复:


这个东西在哪设置?以前没弄过这个。



在hibernate.cfg.xml里面

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect </property> 

上面是mysql的断言,看看你的设置是对的不?
1 --------------------编程问答--------------------
引用 18 楼 u010617014 的回复:
<session-factory>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<mapping resource="com/ht/bean/CommoditType.hbm.xml" />
</session-factory>
我设置的是oracle啊。。不过我的是11G这个应该兼容吧?

还没有搞定吗?

引用 18 楼 u010617014 的回复:
<session-factory>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<mapping resource="com/ht/bean/CommoditType.hbm.xml" />
</session-factory>
我设置的是oracle啊。。不过我的是11G这个应该兼容吧?

搞定没?
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
你这里用的是oracle9的方言,你改成通用的看看org.hibernate.dialect.OracleDialect --------------------编程问答-------------------- 我觉得还得从不能捕获异常入手, 根据我不多的经验:没有不能捕获的异常或者错误,除非你捕获的方式不对。贴上来,哥们瞅瞅 --------------------编程问答--------------------
引用 21 楼 jinsong1213 的回复:
我觉得还得从不能捕获异常入手, 根据我不多的经验:没有不能捕获的异常或者错误,除非你捕获的方式不对。贴上来,哥们瞅瞅



try {
super.getHibernateTemplate().update(commoditType);
} catch (DataAccessException e) {
result="no";
e.printStackTrace();
System.out.println(e.getMessage());
}catch (Throwable e1) {
System.out.println(e1.getMessage());
e1.printStackTrace();
}



这个异常捕获不到。。 --------------------编程问答--------------------
引用 20 楼 u010684923 的回复:
Quote: 引用 18 楼 u010617014 的回复:

<session-factory>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<mapping resource="com/ht/bean/CommoditType.hbm.xml" />
</session-factory>
我设置的是oracle啊。。不过我的是11G这个应该兼容吧?

还没有搞定吗?

引用 18 楼 u010617014 的回复:
<session-factory>
<property name="show_sql">true</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">scott</property>
<property name="connection.password">tiger</property>
<mapping resource="com/ht/bean/CommoditType.hbm.xml" />
</session-factory>
我设置的是oracle啊。。不过我的是11G这个应该兼容吧?

搞定没?
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
你这里用的是oracle9的方言,你改成通用的看看org.hibernate.dialect.OracleDialect



试过了。。还是不可以。。 --------------------编程问答-------------------- 我感觉不行我就把项目推了从弄。。用jQuery来做无限级树。。。 --------------------编程问答-------------------- 使用jstack 看看堆栈情况 --------------------编程问答-------------------- 数据库那边有没有profiler看看
或者你自己写一个JDBC的Statement,一定是Statement写死的中文,然后executeUpdate()看看行不
我觉得是java文件的字符编码问题,properties里看看,和你程序设置的字符编码是否一致 --------------------编程问答-------------------- String hql = insert into CommoditType(name, topid, id) values ('测试', '0000', 'a1s2d5f4e8w9q6a3');
session.executeUpdate(hql);
也试试 --------------------编程问答--------------------    我是来接分的。。呵呵 --------------------编程问答-------------------- 确实太奇怪了。。 --------------------编程问答-------------------- 我终于找到原因了。。我之前用的是10G 现在用的是11g可是jar包用的是ojdbc14.jar
我把jar包换成ojdbc6.jar就没有问题了。。一切正常。。。
还是感谢大家的耐心解答。。。。。。。。。。 --------------------编程问答--------------------
引用 29 楼 yy52113142011 的回复:
确实太奇怪了。。


引用 28 楼 zhouren1314 的回复:
   我是来接分的。。呵呵


引用 27 楼 sunbo624 的回复:
String hql = insert into CommoditType(name, topid, id) values ('测试', '0000', 'a1s2d5f4e8w9q6a3');
session.executeUpdate(hql);
也试试


引用 25 楼 finallygo 的回复:
使用jstack 看看堆栈情况


引用 21 楼 jinsong1213 的回复:
我觉得还得从不能捕获异常入手, 根据我不多的经验:没有不能捕获的异常或者错误,除非你捕获的方式不对。贴上来,哥们瞅瞅


成功解决。。 --------------------编程问答-------------------- 原来是驱动的问题。。。  --------------------编程问答-------------------- 总结下
1:驱动JAR包
2:方言设置
3:数据库字符集设置
补充:Java ,  Web 开发
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,