Blog信息 |
blog名称: 日志总数:1304 评论数量:2242 留言数量:5 访问次数:7579046 建立时间:2006年5月29日 |

| |
[Hibernate]UserType实例——User的Email列表 软件技术
lhwork 发表于 2007/2/2 17:25:56 |
1.实现UserType接口的EMailList自定义类型
import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Types; import java.util.ArrayList; import java.util.List;
import org.apache.commons.lang.StringUtils;
import net.sf.hibernate.Hibernate; import net.sf.hibernate.HibernateException; import net.sf.hibernate.UserType; import net.sf.hibernate.hql.Parser;
/** * @author hy-he * */< |
|
[Hibernate]Hibernate的自定义数据类型实现接口之一——UserType祥解 软件技术
lhwork 发表于 2007/2/2 17:25:29 |
import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
import net.sf.hibernate.HibernateException;
/** * @author hy-he * */ public interface UserType { /** * 返回UserType所映射字段的SQL类型(java.sql.Types) * 返回类型为int[],其中包含了映射个字段的SQL类型代码 * (UserType可以映射到一个或者多个字段) * @return */ public int[]sqlTypes(); /** * UserType.nullSafeGet()所返 |
|
[Hibernate]一个简单的复合主键的做关联类的例子 软件技术
lhwork 发表于 2007/2/2 16:09:24 |
场景是这样的:
用户类User,物品类Goods,每次记录用户使用物品的情况,情况包括谁在什么时间借了什么物品。其中有一个约束条件就是用户只能对同一物品使用一次。使用记录类为Record类。我们可以看出User对Record是1:n多的关系,Record对Goods是n:1的关系,而User和Goods之间没有之间的关系。
RecordId类是复合主键类,分别以n:1关联User类,n:1关联Goods类。RecordId类需要实现equals方法,需要实现Serializable。而Record类用RecordId来做主键。
类定义如下:
java代码
/*
* Created on 2004-10-20
*
*/ |
|
[Hibernate]use AOP to simplify hibernateTemplate (Hibernate3) 软件技术
lhwork 发表于 2007/1/23 12:08:54 |
Spring ORM 替 Hibernate 的 API (Session and Query) 做了一番修整,也就是 HibernateTemplate ,它最主要的目的是 resource 控管及 exception 的轉換。有了這個 persistence layer 的 code 就可以大量的減少並且降低出錯的機會。然而這個 API 卻抹剎了 Hibernate API 的簡單易用優點,舉例來說,如果藉由 hibernateTemplate 控制 Hibernate Session (ex. Criteria),唯一的做法就是寫很難看的 Callback:
public MyData findByNo(final String no) { final String hql = " select data from MyData data " + " where data.no = :no "; HibernateCallback hc = new HibernateCallback() { publi |
|
[Hibernate]Hibernate 学习小结 软件技术
lhwork 发表于 2007/1/22 16:48:45 |
一、PO的数据类型设置 int 还是Integer Integer 允许为 null Hibernate
既可以访问Field也可以访问Property,访问Property是只是调用getXXX()、setXXX()方法,因此在from Customer
where c.name=’Tom’ HQL中,name属性不需要存在,只要getName()存在就可以了。
二、Hibernate映射
1、映射复合主键
代码
主键类 Public class CustomerId i |
|
[Hibernate]Using Lifecycles and Interceptors to update Lucene searches 软件技术
lhwork 发表于 2007/1/22 14:52:33 |
Everybody but your boss understands that a relational database isn't "searchable" in the usual sense - you have to explicitly identify keywords, maintain search tables, etc. Fortunately it's easy to do incremental updates of Lucene (http://jakarta.apache.org/lucene/docs/index.html) indexes via the Hibernate Lifecycle |
|
[Hibernate]手动构建Hibernate Annotations Lucene的索引 软件技术
lhwork 发表于 2007/1/22 14:35:27 |
在使用Hibernate的Lucene的时候,是通过事件监听器的方式来更新索引的。但是通常情况下,尤其是测试的时候,通过其他方式插入数据库,比如通过DbUnit。这个时候就需要同步的手动创建索引,我根据Hibernate Lucene的源代码,自己写了一个简单的程序。
原理很简单:先删除所有的索引,然后再添加。
我是对User这个实体进行索引的。
private static void remove(DocumentBuilder builder, Serializable id) { Term term = builder.getTerm( id ); try { IndexReader reader = IndexReader.open( builder.getFile() ); reader.delete( term ); reader.clo |
|
[Hibernate]Hibernate Annotations Lucene Integration的使用 软件技术
lhwork 发表于 2007/1/22 14:32:19 |
在RDBMS里面做搜索是一件困难的事情。现在的需求是需要对用户的资料进行搜索。用户的资料由多个域组成,其中包含用户的爱好,工作经验等。这些域都是文本,包含大量的信息。
对用户这个实体使用标注@Indexed(index = "users")来指定本实体需要被索引,索引存放的文件夹是users,可以在Hibernate配置文件中使用hibernate.lucene.index_dir来指定默认的索引目录。
Lucene索引的4种类型,分别是Keyword,Text,Unstored,Unindexed。
为Hibernate添加监听器,这样当实体更新之后,索引也会自动更新。
<!-- 插入Lucene事件监听器使得数据库更新时可以自动更新索引 --> <event type="post-commit-update"> <listener class="org.hibernate.lucene.event.LuceneE |
|
[Hibernate]Hibernate中双向关联加载排序的解决方案 软件技术
lhwork 发表于 2007/1/20 10:58:47 |
问题:Hibernate的<many-to-many>双向关联中,一方加载另一方时,怎么样达到按自定义规则排序的目的呢?
实例:角色和菜单是多对多的关系,为角色分配菜单后,加载菜单时,我需要按照菜单的ID来排序显示。
解决办法:
1. 通过在hbm配置文件中配置解决,需要自定义比较器。
1) 在多对多的主控端指定< |
|
[Hibernate]hibernate集合映射inverse和cascade详解 软件技术
lhwork 发表于 2007/1/19 11:53:56 |
4. hibernate如何根据pojo来更新数据库
4.0 在commit/flush之前,hibernate不会对pojo对象作神秘的处理。 4.0.1 在select查询出pojo时,hibernate根据“字段--属性”的对应关系,用字段的值填充pojo的属性; 然后根据“关系标记”生成sql语句从relationTable中查询出满足条件的relationPojo,并把这些relatinPojo 放到“关系属性”中。这个过程是机械的。
4.0.2 在pojo对象被查出来后,到commit(或flush)之前,它将是一个普通的java对象,hibernate不会做额外的手脚。 比如,不会限制你设置一个属性的值为null或其它任何值 在集合类Set的add(object)操作时, 不会改变object的值,不会检查参数object是否是一个pojo对象 设置mainPojo的一个“桥属性”的值,不会自动设置relationPojo的对应的“桥属性”的值。 执行session.delete(poj |
|
|