【Hibernate】如何支持SQL Server的uniqueidentifier类型作为主键

頑笑 2009-08-27 02:50:41
首先,建议斑竹开一个Java常用框架的栏目,我找了一圈,都没有发现框架板块。

言归正传,我使用的MS SQL Server2005,在Student表中设置了一列StudentGUID(uniqueidentifier数据类型)作为逻辑主键,然后通过Hibernate反向工程生成实体映射文件如下:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="pojo.StudentInfo" table="StudentInfo" schema="dbo" catalog="FCXX">
<id name="studentGuid" type="java.lang.String">
<column name="StudentGUID" length="36" />
<generator class="native" />
</id>
<many-to-one name="classInfo" class="pojo.ClassInfo" fetch="select" cascade="save-update">
<column name="F_ClassGUID" />
</many-to-one>
<property name="studentName" type="java.lang.String">
<column name="StudentName" length="50" />
</property>
</class>
</hibernate-mapping>

但是在新增一条学生信息的时候报错,报错信息是:
org.hibernate.AssertionFailure: null identifier
at org.hibernate.engine.EntityKey.<init>(EntityKey.java:39)

于是,我修改了主键生成策略,也就是将<generator class="native"/>改为<generator class="uuid.hex"/>,但是这样又会报错,错误信息是:
com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting from a character string to uniqueidentifier.
逼不得已,我又将数据库中该字段的数据类型由uniqueidentifier修改成了nvarchar(36),可以成功插入了。

事情本已结束,但是我多了几个疑问:
1. 该问题我的解决方案并不好,因为这样虽然可以在程序端成功插入数据,但是如果直接操作数据库的情况下,不能保证主键自动生成,当然可以借助默认值为newid(),但如果这样,那uniqueidentifier这个数据类型还有什么用呢?鸡肋?
2. 对于最开始的主键生成策略设置为native,即由实际数据库的主键生成策略完成主键赋值,Hibernate生成的SQL语句中可以看到也没有插入主键列,但是这种方式为什么对于uniqueidentifier类型就是失效的,而对于自动增长列类型就有用呢?
3. 我感觉我的解决方案不好,希望大家提出好的方法,而且我猜测可能可以通过unsaved-value属性来完成。

希望大家能讨论讨论啊。
...全文
637 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ289172257 2011-12-02
  • 打赏
  • 举报
回复
uniqueidentifier 学习下
頑笑 2009-08-28
  • 打赏
  • 举报
回复
好,结贴。
fish200x 2009-08-28
  • 打赏
  • 举报
回复
native是自增长
uuid是不重复的主键
xiaozejun 2009-08-27
  • 打赏
  • 举报
回复
native他主要针对的是 sql server中 的int类型的自动增长标识列
而uniqueidentifier 其实原则上来说 他并不能算是自动增长的
因为uniqueidentifier 数据类型不会按照 IDENTITY 属性的方式为插入的行自动生成新的 ID。例如,若要获取新的 uniqueidentifier 值,则表必须具有指定 NEWID 函数或 NEWSEQUENTIALID 函数的 DEFAULT 子句,或 INSERT 语句必须使用 NEWID 函数。
頑笑 2009-08-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 cupid1984 的回复:]
但是在新增一条学生信息的时候报错,报错信息是:
org.hibernate.AssertionFailure: null identifier
at org.hibernate.engine.EntityKey. <init>(EntityKey.java:39)
[/Quote]
补充一下
虽然发生了上述的断言错误,但是数据还是插入了数据库。

81,122

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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