论坛首页 Java企业应用论坛

about how to define UserType

浏览 9345 次
该帖已经被评为精华帖
作者 正文
   发表时间:2003-09-19  
Hi all,

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!
   发表时间: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的设计思路。
0 请登录后投票
   发表时间:2003-11-24  
&gt;&gt;用户自己创建一个DoubleStringType的数据类型,&gt;&gt;该类型将作为Hibernate的持久对象的主键来使用,&gt;&gt;相对于普通持久对象的id。

请问这样做有什麽好处吗
还有就是第一段代码返回的Object代表什麽呢?
0 请登录后投票
   发表时间: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配置,望赐教!
0 请登录后投票
   发表时间:2004-12-23  
Robbin每次碰到这个问题都很积极回答,不过每次都回答得不够详细:-(
如果只是作为property,那usertype和component的区别在哪里呢?什么时候应该用哪一个呢?
0 请登录后投票
   发表时间:2004-12-23  
上面两个帖子统一回答:

1、UserType不是用来做主键的(虽然也可以,但是那样和复合主键没有区别了,并且复合主键是非常不推荐的做法)

2、UserType比Component更加灵活,适用性更强,封装的更透明。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics