《深入浅出Hibernate》(2)实体层次分析,数据关联等

来源:互联网 发布:昆明最新网络咨询招聘 编辑:程序博客网 时间:2024/05/17 23:17

1。实体层次设计:分为3类

A。Table per concret class

表与子类之间独立的一对一关系,父类不独立设表。因此子类表的父类字段必须保持一致,如果父类发生变动,相应子类也要发现更改。在某些应用中,如果要对父类进行查询,必须对所有子表进行查询并汇总,性能低下。那么,我们是否可以把父类独立成表?

B。Table per subclass

父类独立成表,子表中只保存所扩展属性,通过外键关联。如此可不必为子类编写映射文件,在父类映射文件中通过<joined-subclass>配置,注意必须配置<key>属性。本质上是运行中通过SQL的case子句进行判断。3个表?是不是太多了,一般情况下我们都是通过一个表的冗余数据来处理。

C。Table per class hierarchy

把所有父类和子类扩展属性全放在一个表中,通过一个Discriminator(辨别标记)来对子类进行区分。在映射文件中先声明辨别标记:

<discriminator colunm="category" type="String">

在subclass元素中指定标记值,如:

<subclass name="TBook" discriminator-value="1">

 

2。数据关联。这是ORM的重要特征,不良的数据关联设计将对性能产生致命影响。讨论了一对一,一对多,多对多3种关联模式。特别是一对多关系下,一般把控制转移给many一方,在主控方设置inverse="true",避免约束违例和提高性能等。注意,被控方的cascade需要小心设置。级联更新最好通过主控对象。被控方需要自己维护关联属性。而多对多关系,要根据情况采用延迟加载。

3。Hibernate的数据检索。

A。讨论了使用Criteria进行查询的操作,注意在hibernate3中取消了find方法,用Restrictions做为Expression的替代,两者方法基本一致。Example查询多用于组合查询。并且Criteria通过createCriteria()方法支持复合查询。

   Hibernate3提供了一个新的Criteria:DetachdCriteria。此类可脱离Session实例而存在。这样我们就可以将某些通用的Criteria查询条件进行抽离,每次使用前再与当前的Session绑定以获得更好的代码重用效果,典型应用如下:

DetachedCriteria deCriterial=DetachedCriteria.forClass(TUser.class);

 deCriterial.add(Restrictions.eq("age",new Integer(30)));

Criteria criteria=deCriterial.getExecutableCriteria(session);

也可以用于查询表达作为子查询,具体不多说。

Hibernate3中还可以通过Criteria完成分组和统计,分组、统计的表达式由新引入的Projections封装,Criteria通过setProjection()方法设定表达式。

 

B。HQL语言,在hibernate3中增加了删除和更新。典型如:

Transaction tran=session.beginTransaction();

String hql="update TUser set age=18 where id=1";

Query query=session.createQuery(hql);

int ret=query.executeUpdate();   //返回更新的字段数目

tx.commit();

4种加载方式:立即加载,预先加载,延迟加载,批量加载。

Hibernate3提供了对原生SQL和存储过程的支持。通过session.createSQLQuery(String sql,String alia,Class object)方法。引入自定义持久化实现,在映射文件中新增3个节点:<sql-insert><sql-delete><sql_update>指定用于insert,delete,update操作的SQL语句,避免了hibernate自动生声SQL语句的局限。