太奇怪了。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()更新这个测试的实例,看看结果如何? --------------------编程问答--------------------
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 。 --------------------编程问答--------------------
Hibernate: insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values (?, ?, ?)
Hibernate: update SCOTT.COMMODITYTYPE set NAME=?, TOPID=? where ID=?
打印了。。看着没啥问题。。而且我带入的值没有汉字就可以使用。。
有汉字就没反应。。这个问题出在哪? --------------------编程问答--------------------
那你直接在数据库COMMODITYTYPE这个表里插入name为中文的记录行么?
用你hibernate打印的insert into SCOTT.COMMODITYTYPE (NAME, TOPID, ID) values ("测试", "0000", "a1s2d5f4e8w9q6a3");这句sql在数据库查询器中输入试试
--------------------编程问答--------------------
你可以在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'); --------------------编程问答--------------------
你可以在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');
很有可能是驱动问题,是不是其它表也插不了中文? --------------------编程问答--------------------
你可以在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插入到数据库的时候出现问题。那么在哪能看到这个错误呢? --------------------编程问答--------------------
你可以在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试试 --------------------编程问答--------------------
你可以在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用的是什么方言?
是不是和数据库相配? --------------------编程问答--------------------
照你们这么说,这跟数据库是没有关系的。
程序有问题,看看你hibernate用的是什么方言?
是不是和数据库相配?
如果不匹配的话。那么我插入非中文的时候也应该是失败啊。。
可是只有插入中文的时候是不行的。。 --------------------编程问答--------------------
照你们这么说,这跟数据库是没有关系的。
程序有问题,看看你hibernate用的是什么方言?
是不是和数据库相配?
如果不匹配的话。那么我插入非中文的时候也应该是失败啊。。
可是只有插入中文的时候是不行的。。
注意方言,数据库是有言的。
还是换个言试吧,我认为问题是在选择方言上有问题。 --------------------编程问答--------------------
照你们这么说,这跟数据库是没有关系的。
程序有问题,看看你hibernate用的是什么方言?
是不是和数据库相配?
如果不匹配的话。那么我插入非中文的时候也应该是失败啊。。
可是只有插入中文的时候是不行的。。
注意方言,数据库是有言的。
还是换个言试吧,我认为问题是在选择方言上有问题。
这个东西在哪设置?以前没弄过这个。 --------------------编程问答-------------------- 楼上正解,我当初出现过这个问题。一模一样,就是方言问题。重新检查一下配置。 --------------------编程问答--------------------
这个东西在哪设置?以前没弄过这个。
在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这个应该兼容吧? --------------------编程问答--------------------
这个东西在哪设置?以前没弄过这个。
在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这个应该兼容吧?
还没有搞定吗?
<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 --------------------编程问答-------------------- 我觉得还得从不能捕获异常入手, 根据我不多的经验:没有不能捕获的异常或者错误,除非你捕获的方式不对。贴上来,哥们瞅瞅 --------------------编程问答--------------------
我觉得还得从不能捕获异常入手, 根据我不多的经验:没有不能捕获的异常或者错误,除非你捕获的方式不对。贴上来,哥们瞅瞅
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();
}
这个异常捕获不到。。 --------------------编程问答--------------------
<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这个应该兼容吧?
还没有搞定吗?
<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就没有问题了。。一切正常。。。
还是感谢大家的耐心解答。。。。。。。。。。 --------------------编程问答--------------------
确实太奇怪了。。
我是来接分的。。呵呵
String hql = insert into CommoditType(name, topid, id) values ('测试', '0000', 'a1s2d5f4e8w9q6a3');
session.executeUpdate(hql);
也试试
使用jstack 看看堆栈情况
我觉得还得从不能捕获异常入手, 根据我不多的经验:没有不能捕获的异常或者错误,除非你捕获的方式不对。贴上来,哥们瞅瞅
成功解决。。 --------------------编程问答-------------------- 原来是驱动的问题。。。 --------------------编程问答-------------------- 总结下
1:驱动JAR包
2:方言设置
3:数据库字符集设置
补充:Java , Web 开发