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,欢迎讨论......