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

| |
[Hibernate]精通Hibernate映射继承关系之三 软件技术
lhwork 发表于 2006/12/22 17:11:44 |
这种映射方式只需为继承关系树的Employee根类创建一张表EMPLOYEES。如图14-4所示,在EMPLOYEES表中不仅提供和
Employee类的属性对应的字段,还要提供和它的两个子类的所有属型对应的字段,此外,EMPLOYEES表中需要额外加入一个字符串类型的
EMPLOYEE_TYPE字段,用于区分Employee的具体类型。
图14-4 继承关系树的根类对应一个表
Company类和Employee类有相应的映射文件,而HourlyEmployee类和SalariedEmployee类没有相应的映射文件。图14-5显示了持久化类、映射文件和数据库表之间的对应关系。
|
阅读全文(1515) | 回复(0) | 编辑 | 精华 | 删除 |
| |
[Hibernate]精通Hibernate映射继承关系之二 软件技术
lhwork 发表于 2006/12/22 17:11:17 |
把每个具体类映射到一张表是最简单的映射方式。如图14-2所示,在关系数据模型中只需定义COMPANIES、HOURLY_EMPLOYEES和
SALARIED_EMPLOYEES表。为了叙述的方便,下文把HOURLY_EMPLOYEES表简称为HE表,把
SALARIED_EMPLOYEES表简称为SE表。
HourlyEmployee
类和HE表对应,HourlyEmployee类本身的rate属性,以及从Employee类中继承的id属性和name属性,在HE表中都有对应的字
段。此外,HourlyEmployee类继承了Employee类与Company类的关联关系,与此对应,在HE表中定义了参照COMPANIES表
的COMPANY_ID外键。
SalariedEmployee类和SE表对应,SalariedEmployee类本身的salary
属性,以及从Employee类中继承的id属性和name属性,在SE表中都有对应的字段。此外,SalariedEmployee类继承了
Employee类与Company类的关联关系,与此 |
|
[Hibernate]精通Hibernate映射继承关系之一  软件技术
lhwork 发表于 2006/12/22 17:10:44 |
在域模型中,类与类之间除了关联关系和聚集关系,还可以存在继承关系,在图14-1所示的域模型中,Company类和Employee类之间为一对多的
双向关联关系(假定不允许雇员同时在多个公司兼职),Employee类为抽象类,因此它不能被实例化,它有两个具体的子类:
HourlyEmployee类和SalariedEmployee类。由于Java只允许一个类最多有一个直接的父类,因此Employee类、
HourlyEmployee类和SalariedEmployee类构成了一棵继承关系树。
图14-1 包含继承关系的域模型
在面向对象的范畴中,还存在多态的概念,多态建立在继承关系的基础
上。简单地理解,多态是指当一个Java应用变量被声明为Employee类时,这个变量实际上既可以引用Hou |
|
[Hibernate]在hibernate的对象关联中慎用outer-join属性值 软件技术
lhwork 发表于 2006/12/22 17:03:51 |
outer-join属性在hibernate表示迫切左外连接检索。
在xdoclet生成hibernate的hbm文件的时候,对持久化对象的关联对象(包括one-to-one,one-to-many,many-
to-one,many-to-many等等),如果不指定outer-join的值的话,默认值为outer-join=auto。
然而,在使用过程中,我发现,对于outer-join=auto的情况,经常会发生错误。比如说many-to-one、one-to-many的关联
对象无法加载(对于集合已设定lazy=false,采用立即检索,理论上说与outer-join=auto联合应该能立即加载关联对象),当时没做总
结,具体在什么条件下产生问题我已经忘了,不过根源可能跟我下面想要说的问题的根源一致。
在这里主要想说得是针对many-to-many中outer-join取值不同所导致的一些问题,发在这里,权作备忘。系统使用的hibernate版本是3.0. |
|
[Hibernate]Hibernate中的inverse 软件技术
lhwork 发表于 2006/12/22 16:36:46 |
<set>元素的inverse属性很有意思,默认值是false Customer customer =(Customer)session.load(Customer.class,new Long(5)); Order order =(Order)session.load(Order.class,new Long(6)); order.setCustomer(customer); custom |
|
[Hibernate]Hibernate的检索策略 软件技术
lhwork 发表于 2006/12/22 16:29:26 |
对迫切左外连接检索的限制:在一个select语句中只允许包含一个一对多关联或多对多关联在一个select语句中可以允许包含多个一对一关联或多对一关联Hibernate的配置文件中的hibernate_max_fetch_depth属性来控制外连接的深度hibernate_max_fetch_depth属性的合理取值取决于数据库系统的表连接性能及表的大小,如果数据库的记录少,并且数据库系统具有良好的表连接性能,可以把该值设置的高点通常设为4
<set>元素来配置一对多或多对多的关联关系,<set>元素有lazy和outer-join的属性立即检索 如果一对的很多的情况下使用了立即检索的策略就会浪费大量的内存空间,所以一对多的关联不可随意使用立即检索策略延迟检索 应该优先考虑延迟检索批量延迟检索和批量立即检索 设定batch_size属性.在sql语句中会使用or进行批量初始化,batch_size属性不宜设置太大,如果设置 |
|
[Hibernate]Hibernate访问多个数据库 软件技术
lhwork 发表于 2006/12/22 16:14:06 |
一、Hibernate访问数据库时加载的过程
对于大多数使用Hibernate的朋友来说,通常使用一下方式来获得Configuration实例: Configuration configure = new Configuration().configure();
在Hibernate中,Configuration是hibernate的入口。在实例化一个Configuration的时候,Hibernate会
自动在环境变量(classpath)里面查找Hibernate配置文件hibernate.properties。如果该文件存在,则将该文件的内容
加载到一个Properties的实例GLOBAL_PROPERTIES里面,如果不存在,将打印信息 hibernate.properties
not found;
接下来Hibernate将所有系统环境变量(System.getProperties())也添加到GLOBAL_PROPE |
|
[Hibernate]什么叫n+1次select查询问题? 软件技术
lhwork 发表于 2006/12/22 16:11:05 |
在Session的缓存中存放的是相互关联的对象图。默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的
Order对象。以Customer和Order类为例,假定ORDERS表的CUSTOMER_ID外键允许为null,图1列出了CUSTOMERS
表和ORDERS表中的记录。
以下Session的find()方法用于到数据库中检索所有的Customer对象:
List customerLists=session.find("from Customer as c");
|
|
[Hibernate]Hibernate学习心得--性能优化 软件技术
lhwork 发表于 2006/12/22 15:47:16 |
在使用Hibernate进行查询的时候大家都会用到Hibernate缓存,其中Session缓存即一块内存空间,存放了相互关联的Java对象,这
些位于Session缓存中的对象就是持久化对象,Session根据持久化对象的状态变化来同步更新数据库。这个Session缓存是
Hibernate的一级缓存。此外,SessionFactory有一个内置缓存和一个外置缓存,即Hibernate的第二级缓存。而
Hibernate正是由于这些缓存的存在,才使得其数据库操作效率提高,就是说,在提供了方便易操作的操作数据库数据的方式的同时保证了工作效率,但是
不能因此而免去后顾之忧,需要在设计业务逻辑层的时候考虑使用最优的架构,节省有效的系统资源。在查询方面,Hibernate主要从以下几个方面来优化
查询性能:
1.降低访问数据库的频率,减少select语句的数目。实现手段包括:
使用迫切左外连接或迫切内连接检索策略。 &nbs |
|
|