`
lzj520
  • 浏览: 213525 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

070827 hibernate关联、联级操作、对象生命周期、检索策略

阅读更多

在mysql里建立2个表
CREATE TABLE `customers` (
  `id` int(11) NOT NULL auto_increment,
  `name` char(20) character set latin1 default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `orders` (
  `id` int(11) NOT NULL auto_increment,
  `customer_id` int(50) NOT NULL default '0',
  `order_number` int(50) default NULL,
  PRIMARY KEY  (`id`),
  KEY `fk_customer_id` (`customer_id`),
  CONSTRAINT `fk_customer_id` FOREIGN KEY (`customer_id`) REFERENCES `customers` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后自动生成持久化类,在customers.hbm.xml一方设置与orders的外键customer_id的一对多关联,其中联级操作为save-update,inverse="true"为表示hibernate不由customers对象的状态变化来更新数据库,仅按照Orders对象状态变化来更新数据库。由此来优化hibernate的性能。
 <set name="orderses" inverse="true" cascade="save-update">
            <key>
                <column name="customer_id" unique="true" />
            </key>
            <one-to-many class="com.yourcompany.model.Orders" />
        </set>

在orders.hbm.xml设置多对一关联,其中业务逻辑决定了order是由customer来下决定的,所以必须not-null="true" ,联级操作根据实际情况而定,本例子的逻辑关系里面,应该不需要在many-to-one一方设置save-update联级操作,因为增加orders并不需要增加customer。在目前的情况里如果设置了save-update,增加orders记录的时候hibernate就会把原来已存在的customers记录设置为null。这是不对的。
        <many-to-one name="customers" class="com.yourcompany.model.Customers" fetch="select" >
            <column name="customer_id" not-null="true" unique="true" />
        </many-to-one>

在AddCustomerAction里保存一个customers,之后可以看到当保存一个customers的同时,orders也同时保存了该customers的id。
  String strname = addCustomerForm.getString("name");
  Customers customers = new  Customers();
  customers.setName(strname);
  Orders orders=new Orders();
  orders.setCustomers(customers);
  customers.getOrderses().add(orders);
  customersDAO.save(customers);

其中
  orders.setCustomers(customers);
  customers.getOrderses().add(orders);
在建立两个对象的双向关联时,应该同时修改关联两端的对象的相应属性,这样可提高业务逻辑的独立性。
比如:解除双向关联时:
  customers.getOrderses().remove(orders);
  orders.setCustomers(null);

在AddOrdersAction里,由表单传入customers的ID值和新增加的order_number值。ordersDAO.attachDirty(orders);为Myeclipse里生成的DAO,其调用的是HibernateTemplate的getHibernateTemplate().saveOrUpdate(instance);方法。
  Integer strcustomers= Integer.valueOf(addOrdersForm.getString("customers"));
  Integer strorder_number= Integer.valueOf(addOrdersForm.getString("order_number"));
  Orders orders = new  Orders(); 
  Customers customers = new  Customers();
  customers.setId(strcustomers);
  orders.setCustomers(customers);
  orders.setOrderNumber(strorder_number);
  ordersDAO.attachDirty(orders);

在这里的持久化对象的生命周期里,当Customers customers = new  Customers();时,Customers还属于临时状态,而到了sessionv.save(customers);的时候Customers由临时状态转变为持久化状态。临时状态时不处于Session缓存中,转化为持久化状态后Customers就加入到了Session缓存中,在此Customers customers 2=(Customers)session.load(Customer.class,id);、Customers customers 3=(Customers)session.load(Customer.class,id);、均是在持久化状态。而直到session.close();就表明Customers退出了Session缓存,由持久化状态转变为游离状态。System.out.println(customers 3.getname());也是处于游离状态。到最后c2=null;c3=null;Customers生命周期结束。

Session有三种检索方法:load()、get()、find(),检索策略有类级别的:立即检索、延迟检索,关联级别的立即检索、延迟检索、迫切左外连接检索。在类级别中应该有线考虑使用立即检索。不管hbm文件里lazy属性是true还是false,Session的get()、find()方法总是使用立即检索策略。

在一对多关联级别中,对于<set>元素不能随意使用立即检索策略,尽量使用延迟检索策略。应用程序如果新闻访问游离状态的代理类实例,必须保证它在持久化状态时已经被初始化,不然会抛出异常

对于多对一或一对一关联,应该优先考虑使用外连接检索策略,因为它比立即检索策略使用的select语句数目少。在默认情况下<many-to-one>元素的outer-join属性为auto,<class>元素的lazy属性为false,因此默认使用迫切外连接检索策略。迫切外连接检索策略受数据库表的大小和连接影响,如果select语句中的外连接表的数目太多,会影响检索性能,可以通过Hibernate配置文件中的hibernate.max_fetch_depth来达到优化。hibernate.max_fetch_depth取决数据库连接性能及表大小。

分享到:
评论

相关推荐

    hibernate session生命周期示例

    本示例将深入探讨Hibernate Session的生命周期及其使用,帮助你更好地理解和运用这个强大的工具。 Hibernate Session是Hibernate的核心接口,它是与数据库交互的主要接口。Session对象负责管理实体对象的状态,包括...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通Hibernate:Java对象持久化技术详解

    6. **实体生命周期管理**:Hibernate自动管理对象的状态,包括瞬态、持久化、托管和脱管四种状态,以及它们之间的转换。 7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、...

    hibernate教程hibernate教程

    **二级缓存**是SessionFactory级别的,是可插拔的缓存插件,可以跨多个Session共享,其生命周期与应用程序的生命周期相对应,是进程范围或集群范围的缓存。二级缓存存储的是对象的原始数据,而不是对象实例。二级...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    北大青鸟Hibernate学习资料

    同时,文档《Hibernate对象状态及一对多关联.doc》详细介绍了如何设置和管理一对多关联,这种关联在企业级应用中非常常见,例如一个用户可以有多个订单。 2. **一对一和多对多关联** 在《Hiberate一对一和多对多...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    Hibernate实战

    实体管理是Hibernate中的重要部分,书中会详细介绍如何定义实体类,使用注解来声明属性与数据库字段的映射,以及如何实现对象的生命周期管理,包括瞬时态、持久态、托管态和游离态。此外,还会讲解实体间的一对一、...

    harnessing_hibernate3 源码和书

    7. **懒加载和级联操作**:Hibernate支持懒加载策略,延迟加载关联的对象,以提高性能。级联操作则可以一次处理对象及其关联对象的保存、删除等操作。 8. **第二级缓存和查询缓存**:Hibernate的缓存机制可以显著...

    Hibernate源码

    Hibernate是Java领域中一款广泛应用的关系型数据库对象映射框架,它简化了开发人员与数据库之间的交互,通过ORM(Object-Relational Mapping)技术将Java对象转换为SQL操作,从而实现数据持久化。Hibernate源码分析...

    hibernate源码

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与业务对象进行解耦,简化了数据库编程。源码分析是深入理解其工作原理的关键,特别是对于那些希望优化性能、解决特定问题或者扩展其...

    hibernate 重点知识原创

    持久化是 Hibernate 的核心概念,它确保对象的状态可以在应用程序的生命周期内得以保存,即使关闭了数据库连接,也能在后续的会话中恢复。OID(Object Identifier)是对象在数据库中的唯一标识,类似于关系数据库中...

    hibernate3.0的文档

    - 对象状态:Hibernate定义了四种对象状态:瞬时态、持久态、脱管态和临时态,理解这些状态有助于正确处理对象的生命周期。 5. **持久化操作**:通过Hibernate的API,可以方便地进行对象的持久化操作,如保存新...

    Hibernate\hibernate3.2官方中文参考手册PDF

    8. **事件监听器和拦截器**:Hibernate允许用户自定义事件监听器或拦截器,以便在特定的生命周期事件(如对象的保存、更新、删除等)发生时执行自定义逻辑。 9. **实体生命周期**:Hibernate定义了几个关键的实体...

    hibernate3.5

    例如,`@ManyToOne`和`@OneToOne`关联可设置级联类型,如`CascadeType.ALL`,以处理相关对象的生命周期。 6. **懒加载和立即加载**: Hibernate 3.5支持懒加载和立即加载策略。懒加载是在需要时才加载关联对象,而...

    hibernate v3.04中文参考手册

    - 生命周期转换:对象的保存、加载、更新和删除操作。 10. **多对一、一对多、多对多关联映射** - 外键映射、集合映射,如List、Set、Map等。 - 使用@ManyToOne、@OneToOne、@OneToMany、@ManyToMany等注解实现...

    hibernate5.2.12源码包

    6. **实体生命周期**:Hibernate管理对象的生命周期,包括瞬时态、持久态、脱管态和临时态。通过`persist()`, `merge()`, `saveOrUpdate()`, `delete()`等方法,可以控制对象的状态转换。 7. **多对一、一对多、多...

Global site tag (gtag.js) - Google Analytics