Hibernate的数据库存取及中文问题!

tomga 2004-12-08 04:37:12
我用的开发环境是:MyEclipse+Hibernate+Sqlserver2k
使用:VipService.getInstance().getVipdataList(); 取数据时没有问题
但使用:VipService.getInstance().addVipdata(vipdata); 添加数据时出错提示如下:

javax.servlet.ServletException: net.sf.hibernate.JDBCException: Could not save object
org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
javax.servlet.http.HttpServlet.service(HttpServlet.java:763)
javax.servlet.http.HttpServlet.service(HttpServlet.java:856)

我的映射文件:
<hibernate-mapping package="com.nscorp.hibernate">

<class name="Vipdata" table="vipdata">
<id name="vipId" column="vip_id" type="java.lang.Integer">
<generator class="native"/>
</id>

<property name="vipName" column="vip_name" type="java.lang.String" not-null="true" />
<property name="vipTitle" column="vip_title" type="java.lang.String" />
</class>

</hibernate-mapping>

我考虑是否为主键的问题,我设置的主键vip_id是int型的,自己在vipdata表里添加了几个测试的vip_id值为1,2,3~~,请问错误应如何解决,谢谢啦

by the way:
还有个问题是,在eclipse里jsp文件默认设置时,汉字是乱码“??”但数据库里取出的数正常显示为中文;然而我在jsp中添加<%@ page language="java" pageEncoding="utf-8"%>后,页面里正常显示为中文,但在数据库里取出的数缺显示的是乱码,真奇怪,不知大家如何解决的~~

...全文
157 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
noscar 2004-12-16
  • 打赏
  • 举报
回复
在save()之前,把编码转化成gbk看一看....
passwords 2004-12-15
  • 打赏
  • 举报
回复
一般来说是用hibernate来构造自己的主键规则,要不就用程序给它手动指派
禽兽v5 2004-12-09
  • 打赏
  • 举报
回复
用native是可以的,在oracle数据库的时候,会生成一个hibernate_sequence的sequence。所以如果你用oracle,这个sequence的默认开始值是1,很可能会冲突,你可以用客户端工具将它调整到100或者更大值。

如果你是在gui界面中输入中文,由于默认是iso_8859-1编码,要转码为gbk或utf-8(视数据库编码而定)。
禽兽v5 2004-12-09
  • 打赏
  • 举报
回复
你使用的是sql server,那么是没有sequence这种东西的。hibernate的native方案就是increment。
那么错误的产生可能是sql语法不正确。

请检查你的hibernate.cfg.xml中的dialect是否正确:
net.sf.hibernate.dialect.SQLServerDialect
singledoor 2004-12-09
  • 打赏
  • 举报
回复
我深得hibernate的generator 有不少的问题,特别是TangHan插件。
native的话,hibernate会自动去选择三种之一种生成方法。
increment自增。应该没有问题。
我的做法是不要生成器,或者改为assign(指派)。自己写代码来生成。

乱码问题都是由于html,java,数据库的中文编码方式不同造成的。
我的做法是在web.xml中指定。
<filter>
<filter-name>SetEncoding</filter-name>
<filter-class>你的项目工具.SetEncodeFilter</filter-class>
<init-param>
<param-name>defaultencoding</param-name>
<param-value>GBK</param-value>

</init-param>

</filter>
<filter-mapping>
<filter-name>SetEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
lliushine 2004-12-09
  • 打赏
  • 举报
回复
不会,顶啦
tomga 2004-12-09
  • 打赏
  • 举报
回复
1。我改为<generator class="native"/>时,并把sql server里的vipId都改成100以后的,执行时仍旧提示错误:net.sf.hibernate.JDBCException: Could not save object ,我把表中数据清空后还是一样的错误,请问还是id冲突的原因吗?

2。当我使用<generator class="increment"/>主键生成时,在页面中可以正常添加数据
但是执行时用企业管理器无法访问 sql server对应的表,并且tomcat重启后再执行页面时发现刚才正常添加数据都没有了,也就是没有保存到数据库中,请问用increment生成方式有什么错误吗?

(我的表中只有3个字段即:vip_id(int型)、vip_name(varchar型)、vip_title(varchar型))
tomga 2004-12-08
  • 打赏
  • 举报
回复
又开始痛苦了,因为发现如果输入汉字,调用getInstance().addVipdata(vipdata); 方法后添加到数据库里的也是乱码,但英文数字没啥问题~
tomga 2004-12-08
  • 打赏
  • 举报
回复
呵呵~~
第一个问题解决了,果然是主键生成方式的问题
把hibernate的主键生成方式都试了一遍,结果发现改为: <generator class="increment"/>
就没有问题了~~ 不知道是什么原因
Oracle里主键生成不能用sequence,可能是sql server里也有限制的缘故吧 :)
希望大家也发表一下看法~~


第二个汉字是乱码问题还没解决,继续等待~~

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧