浏览 9345 次
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2003-09-19
If I have two fields represent the primary key, I don't want to use <composite-id>, so does anyone know how to create a UserType to do it? Any comments are appreciated. Thanks a lot! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-09-19
xinxin 写道 Hi all,
If I have tow fields represent the primary key, I don't want to use <composite-id>, so does anyone know how to create a UserType to do it? Any comments are appreciated. Thanks a lot! 请看Hibernate2.0.3源代码目录 net.sf.hibernate.test.DoubleStringType 这个例子就是数据库中两个varchar型的字段做复合主键,用户自己创建一个DoubleStringType的数据类型,该类型将作为Hibernate的持久对象的主键来使用,相对于普通持久对象的id。 public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner); throws HibernateException, SQLException { String first = (String); Hibernate.STRING.nullSafeGet(rs, names[0]);; String second = (String); Hibernate.STRING.nullSafeGet(rs, names[1]);; return ( first==null && second==null ); ? null : new String[] { first, second }; } 这个方法是实现了把从数据库中取两个字段的值转换为从Hibernate取一个用户自定义类型的主键,其实代码很简单,就是依次从ResultSet中把两个字段的值取出来,构造一个用户自定义主键类 public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session); throws HibernateException, SQLException { String[] strings = (value==null); ? new String[2] : (String[]); value; Hibernate.STRING.nullSafeSet(st, strings[0], index);; Hibernate.STRING.nullSafeSet(st, strings[1], index+1);; } 这个方法是把用户自定义主键类值保存到数据库中,先把主键类中每个属性取出来,然后用PreparedStatement插入数据库。 这个代码实现实际上很简单,只要明白了Hibernate的设计思路。 |
|
返回顶楼 | |
发表时间:2003-11-24
>>用户自己创建一个DoubleStringType的数据类型,>>该类型将作为Hibernate的持久对象的主键来使用,>>相对于普通持久对象的id。
请问这样做有什麽好处吗 还有就是第一段代码返回的Object代表什麽呢? |
|
返回顶楼 | |
发表时间:2004-12-02
robbin 写道 请看Hibernate2.0.3源代码目录 net.sf.hibernate.test.DoubleStringType 这个例子就是数据库中两个varchar型的字段做复合主键,用户自己创建一个DoubleStringType的数据类型,该类型将作为Hibernate的持久对象的主键来使用,相对于普通持久对象的id。 public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner); throws HibernateException, SQLException { String first = (String); Hibernate.STRING.nullSafeGet(rs, names[0]);; String second = (String); Hibernate.STRING.nullSafeGet(rs, names[1]);; return ( first==null && second==null ); ? null : new String[] { first, second }; } 这个方法是实现了把从数据库中取两个字段的值转换为从Hibernate取一个用户自定义类型的主键,其实代码很简单,就是依次从ResultSet中把两个字段的值取出来,构造一个用户自定义主键类 public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session); throws HibernateException, SQLException { String[] strings = (value==null); ? new String[2] : (String[]); value; Hibernate.STRING.nullSafeSet(st, strings[0], index);; Hibernate.STRING.nullSafeSet(st, strings[1], index+1);; } 这个方法是把用户自定义主键类值保存到数据库中,先把主键类中每个属性取出来,然后用PreparedStatement插入数据库。 这个代码实现实际上很简单,只要明白了Hibernate的设计思路。 在源代码目录里的例子只表示了,用2个字段作为一个property的做法,并不是作为主键的用法。 引用 <property name="twoStrings" type="net.sf.hibernate.test.DoubleStringType"> <column name="first_string"/> <column name="second_string"/> </property> 做为主键应该如何写XML配置,望赐教! |
|
返回顶楼 | |
发表时间:2004-12-23
Robbin每次碰到这个问题都很积极回答,不过每次都回答得不够详细:-(
如果只是作为property,那usertype和component的区别在哪里呢?什么时候应该用哪一个呢? |
|
返回顶楼 | |
发表时间:2004-12-23
上面两个帖子统一回答:
1、UserType不是用来做主键的(虽然也可以,但是那样和复合主键没有区别了,并且复合主键是非常不推荐的做法) 2、UserType比Component更加灵活,适用性更强,封装的更透明。 |
|
返回顶楼 | |