关于 hiberate 的 userType

    hiberate在数据库和jiavabean一一对应的时候提供了除了定制的数据结构以外的更灵活的用法。用户自定义的结构。

    还是那个典型的问题,我们有一个用户,用户存在一个email属性,但是由于email的不唯一性用户和email的关系就是一对多的关系。ok,我们新建一个email的表完成用户和email的映射。没有问题,但是在效率上2张表的查询要比一张表差很多。所以我们采取更灵活的方法,毕竟,解决问题才是王道。我们使用字符串处理保存email 的值,不同的email之间用“;”号分开。这样的数据库在性能上会好很多。但是如果在用户端(应用层)读到这个字符串的话会产生很多麻烦,所有牵涉到增删改查的部分都需要进行字符串的处理。所以一个高效的做法就是将字符串的处理放到底层。这样高层做的操作都会被底层封装。ok,采取一个list保存email的值应该是一个不错的选择。

     首先看一下 hibernate给我们提供的借口。UserType接口。具体的接口方法可以去看hiberate的文档或者看夏昕的深入浅出hiberate。里面都有详细的介绍。下面看一下,我们要实现该接口 需要实现的几个方法。

    1. 首先因为 数据库的 字符串映射到java端的list数据类型。所以 需要包含一个list的属性。

       private List emails;

    2. 其次需要实现 判断俩个自定义数据类型是否相等的函数。

       public boolean equals(Object x, Object y) throws HibernateException

    3.然后是在hiberate查询和更新操作时真正需要调用的方法,该方法从resultset中取出email字段,并将其解析为List类型后返回。

        public Object nullSafeGet(ResultSet rs, String[] names, Object owner) 

    4//将list类型组装成字符串后保存到email字段
      public void nullSafeSet(PreparedStatement st, Object value, int index) 

 

    当然,需要自己具体的实现组装list和拆开list使其成为string的方法。

    下面贴出代码:

user.hbm.xml

 

     EmailList.java

javabean--   tuser.java

测试类 -- HibernateTest.java

 

部分内容也参考了网上的一些前辈们的例子。如果有什么问题的话,给我发email,欢迎讨论......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值