joined-subclass:采用这种映射策略时,父类实例保存在父类表里,而子类实例则由父类表和子类表共同存储。也就是说父类表保存两者共有的属性,子类表保存子类独有的属性。
在这种映射策略下,需要为每个子类使用
union-subclass:采用这种映射策略,父类实例的数据保存在父类表中,子类实例和父类实例的数据共同保存在子类表中。其中子类实例的数据在父类表中没有任何记录。对于这种继承策略,底层数据库的表结构更加符合正常情况下的数据库设计。注意:在采用这种继承映射策略时,映射持久化类时不要使用identity主键生成策略。
十、Hibernate的查询体系
Hibernate提供了强大的查询体系,可以使用如下三种方式使用Hibernate查询:HQL查询、条件查询、SQL查询。
1、HQL查询
HQL查询是完全面向对象的查询语言。它依赖于Query对象,每一个Query实例对应一个查询对象。使用HQL查询按如下步骤进行:
1、获取Hibernate Session对象。
2、编写HQL语句。
3、以HQL语句为参数,调用Session的createQuery方法创建Query查询对象。
4、如果HQL语句包含参数,则调用Query的setXxx方法为参数赋值。
5、调用Query对象的list等方法返回查询结果集。
[html]
private void query(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//以HQL语句创建Query对象,执行setString方法为HQL语句的参数赋值
//Query调用list方法访问查询的全部实例
List list = session.createQuery("select distinct p from Person p where p.name=:name")
.setString("name", "chenssy").list();
//遍历查询结果
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person p = (Person) iterator.next();
System.out.println("id="+p.getId()+",age="+p.getAge());
}
session.close();
2、条件查询
条件查询时更具面向对象特色的数据查询方式。条件查询通过如下三个类完成:
Criteria:代表一次查询。
Criterion:代表一个查询条件。
Restrictions:代表查询条件的工具类。
执行条件查询步骤如下:
1、获得Hibernate Session对象。
2、以Session对象创建Criteria对象。
3、使用Restrictions的静态方法创建Criterion查询条件。
4、向Criteria查询中添加Criterion查询条件。
5、执行Criteria的list()或者uniqueResult()方法返回结果集。
[java]
public void query(){
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
//使用ctiteria进行条件查询
List list = session.createCriteria(Person.class)
.add(Restrictions.eq("id", 1))
.list();
for (Iterator iterator = list.iterator();iterator.hasNext();) {
Person person = (Person) iterator.next();
System.out.println(person.getName());
}
}
3、SQL查询 www.2cto.com
SQL查询时通过SQLQuery接口来表示的。SQLQuery接口是Query接口的子接口。
执行SQL查询的步骤如下:
1、获取Hibernate Session对象。
2、编写SQL语句。
3、以SQL语句作为参数,调用Session的createSQLQuery方法创建查询对象。
4、调用SQLQuery对象的addScalar()或者addEntity()方法将选出的结果与标量值或者实体进行关联,分别用于进行标量查询或者实体查询。
5、如果SQL语句包含参数,调用Query的setXxx方法为参数赋值。
6、调用Query的list方法返回查询的结果集。
标量查询:
[html]
session.createSQLQuery("select * from person_inf")
.addScalar("name",StandardBasicTypes.STRING)
.addScalar("age",StandardBasicTypes.INT)
.list();
实体查询:
[html]
session.createSQLQuery("select * from perons_inf").addEntity(Person.class).list;
session.createSQLQuery("select id,name,age from person_inf").addEntity(Person.class).list();
十一、Hibernate的数据过滤
数据过滤就是对数据进行筛选。一旦启用了数据过滤器,则不管是数据查询,还是数据加载,该过滤器将自动作用与所有数据。
数据过滤器分三步