`

hibernate annotations OneToMany与ManyToOne 分析 以及延迟加

阅读更多

在EJB3.0 规范中 多对一与一对多的双向关系, 多对一(就是@ManyToOne注解的这端,是多端哦 不要搞混了)这端总是双向关联端的主题(owner)端, 而一对多端的关联注解为 @OneToMany(mappedBy=" " )其值是:多对一端的属性

demo:

被动方:其实也就是一方 或者说(OneToMany方)

@Entity
public class Customer extends AbstractEntity {

private String name;

@OneToMany(mappedBy="customer",cascade=CascadeType.ALL)
private Set<Order> orders;

public void addOrder(Order order){
   if(orders == null){
    orders = new HashSet<Order>();
   }
   orders.add(order);
}

public String getName() {
   return name;
}
public void setName(String name) {
   this.name = name;
}
public Set<Order> getOrders() {
   return orders;
}
public void setOrders(Set<Order> orders) {
   this.orders = orders;
}

}

主动方:1.关系的维护方2.ManyToOne方3.多方

@Entity
@Table(name="orders")
public class Order extends AbstractEntity {

private String name;

@ManyToOne(cascade=CascadeType.ALL)
private Customer   customer;

public Customer getCustomer() {
   return customer;
}

public void setCustomer(Customer customer) {
   this.customer = customer;
}

public String getName() {
   return name;
}

public void setName(String name) {
   this.name = name;
}
}

 

以上是实体

下面是测试用列哦

public void testCRUD() {
   // 第一种情况: 调用的被动方的Dao 绑定主动方关系,但主动方没有绑定被动方
   Customer entity = new Customer();
   entity.setName("customer1");
   Order order = new Order();
   order.setName("order1");
   entity.addOrder(order);
   entity = customerDao.create(entity); // 这种情况下 orders.customer_id == null
   //控制台的信息
   //Hibernate: insert into Customer (name, id) values (?, ?)
   //这里的customer_id 为null
   //Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
   System.out.println("entity id = " + entity.getId());
   System.out.println("order id = "+ order.getId());
   System.out.println("1111********************** over");

// 第二种情况: 调用的被动方的Dao 绑定主动方关系,并且主动方也绑定被动方
   entity = new Customer();
   entity.setName("customer2");
   order = new Order();
   order.setName("order2");
   entity.addOrder(order);
   order.setCustomer(entity); //这里进行双向关联
   entity = customerDao.create(entity);
   //
   //Hibernate: insert into Customer (name, id) values (?, ?)
   //这里的customer_id 有值哦
   //Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
   System.out.println("entity id = " + entity.getId());
   System.out.println("order id = "+ order.getId());
   System.out.println("2222********************** over");
   // 第三种情况: 调用的主动方的Dao 绑定被动方关系,但是被东方不绑定主动方
   entity = new Customer();
   entity.setName("customer3");
   order = new Order();
   order.setName("order3");
   order.setCustomer(entity); //绑定被动方
   orderDao.create(order);
   //Hibernate: insert into Customer (name, id) values (?, ?)
   //Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
   System.out.println("entity id = " + entity.getId());
   System.out.println("order id = "+ order.getId());
   System.out.println("3333********************** over");
  
// 第四种情况: 调用的主动方的Dao 绑定被动方关系,并且被东方也绑定主动方
   entity = new Customer();
   entity.setName("customer4");
   order = new Order();
   order.setName("order4");
   order.setCustomer(entity); //绑定被动方
   orderDao.create(order);
   System.out.println("entity id = " + entity.getId());
   System.out.println("order id = "+ order.getId());
   System.out.println("4444********************** over");
   //Hibernate: insert into Customer (name, id) values (?, ?)
   //Hibernate: insert into orders (name, customer_id, id) values (?, ?, ?)
  
   //总结: 经测验二三四种方法结果都是一样都能持久化到数据库,并且关系也建立好了
   //       也就说只要主动方绑定了被动方关系就维护好了
}

 

 

 

*****************************************做级联删除测试************************************************************

public void testCascade(){
  
   //1. 做个级联删除吧 测试删除主动方 是否删除关联方
   // 这里会级联删除主动方的关联对象,以及该关联对象(被动方)所关联的所有主动方都会被级联删除
   orderDao.delete("order_id_1");
           //Hibernate: delete from orders where id=?
     // Hibernate: delete from orders where id=?
     // Hibernate: delete from orders where id=?
     // Hibernate: delete from orders where id=?
     // Hibernate: delete from orders where id=?
     // Hibernate: delete from Customer where id=?
   assertNull( orderDao.findById("orderDao"));
  
   //2. 做个级联删除吧 测试删除被动方 是否删除关联方
   //删除该被动方,以及所关联的所有主动方(维护关系方or多方)与上面的调用主动方的结果一样
        //Hibernate: delete from orders where id=?
   // Hibernate: delete from orders where id=?
   // Hibernate: delete from orders where id=?
   // Hibernate: delete from orders where id=?
   // Hibernate: delete from orders where id=?
   // Hibernate: delete from Customer where id=?
   customerDao.delete("2");
   assertNull( customerDao.findById("2"));
  
}

****************************************************l延迟加载************************************************************

@ManyToOne Default: FetchType.EAGER   默认是即时抓取   做连接 如果,fetch=FetchType.LAZY不是左联接 在需要One的时候直接select

@OneToMany Default: FetchType.LAZY   默认是延迟抓取   不需要左联接 如果是FetchType.EAGER     即时抓取 就会是左联接查询

如果 order(ManyToOne)设置了 @ManyToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)
private Customer   customer;   查找Order是直接查找不需要左连接 customer

Hibernate: select order0_.id as id5_0_, order0_.name as name5_0_, order0_.customer_id as customer3_5_0_ from orders order0_ where order0_.id=?

如果 order(ManyToOne)设置了 @ManyToOne(cascade=CascadeType.ALL) //没有设置延迟加载
private Customer   customer;    查找Order是直接查找需要左连接 customer

Hibernate: select order0_.id as id5_1_, order0_.name as name5_1_, order0_.customer_id as customer3_5_1_, customer1_.id as id2_0_, customer1_.name as name2_0_ from orders order0_ left outer join Customer customer1_ on order0_.customer_id=customer1_.id where order0_.id=?

分享到:
评论

相关推荐

    hibernate-annotations-3.4.0.GA

    《Hibernate Annotations 3.4.0.GA:深入理解与应用》 Hibernate是Java领域中广泛应用的对象关系映射(ORM)框架,它极大地简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。而Hibernate ...

    HibernateAnnotations 中文版

    1. **延迟加载(Lazy Loading)**: 使用 `@OneToMany` 和 `@ManyToOne` 注解时,可以通过 `fetch = FetchType.LAZY` 实现关联对象的懒加载,降低初始化时的内存消耗。 2. **批处理(Batch Processing)**: 通过设置 ...

    hibernate annotations

    4. **关系映射(Relationship Mapping)**:Hibernate支持多种数据库关系,如一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。通过注解,我们可以轻松地定义这些关系,...

    hibernate 和hibernate_annotations(中文API).pdf帮助文档

    在这个“hibernate 和hibernate_annotations(中文API)帮助文档”中,我们将深入探讨Hibernate的核心概念、特性以及如何使用Hibernate Annotations进行对象的持久化。 一、Hibernate核心概念 1. 实体(Entity):在...

    hibernate annotations 中文参考手册

    此版本标志着Hibernate框架中的一个特定阶段,特别是关于如何利用注解(Annotations)来简化Java对象与数据库表之间的映射。 #### Hibernate Annotations 简介 Hibernate 是一款非常流行的 Java 持久化框架,它通过...

    hibernate annotations 3.4.0.GA API

    Hibernate提供懒加载机制,通过@ManyToOne、@OneToOne、@OneToMany和@ManyToMany注解的fetch属性,可以配置为延迟加载或立即加载。同时,@Cascade注解可以定义级联操作,如保存、删除时对关联对象的操作。 7. **...

    hibernate-annotations

    本篇将深入探讨Hibernate Annotations 3.4.0.GA版本中的关键特性、工作原理以及实际应用。 1. **Hibernate Annotations介绍** Hibernate Annotations是Hibernate 3.x引入的一个模块,它允许开发者使用Java 5及以上...

    hibernate-annotations-3.4.0(参考文档,doc/../index.html)

    Hibernate Annotations是Hibernate框架的一个扩展,它允许开发者使用Java语言的注解(Annotations)来定义对象与数据库表之间的映射关系,替代传统的Hibernate XML配置文件。这使得代码更加简洁,更易于维护,并且与...

    hibernate-annotations.jar

    而`hibernate-annotations.jar`是Hibernate框架中的一个重要组件,主要负责处理对象的注解配置,使得开发者能够以更简洁的方式定义数据模型与数据库之间的映射关系。 **一、Hibernate ORM框架** Hibernate ORM是...

    hibernate-annotations 相关jar包

    1. 引入Hibernate和Hibernate Annotations相关jar包:包括hibernate-annotations.jar、hibernate-commons-annotations.jar、hibernate-entitymanager.jar以及JPA规范所需的jar包。 2. 创建实体类:在实体类上添加@...

    hibernate annotations 中文文档

    通过阅读《Hibernate Annotations 中文文档》,开发者不仅可以掌握如何使用注解进行对象关系映射,还能了解到Hibernate如何优化数据库交互,以及如何处理复杂的数据结构和业务逻辑。这对于提高开发效率和代码质量...

    Hibernate Annotations Reference 中文参考手册HTML版

    4. **关系映射**:Hibernate 支持多种关系映射,包括一对一(@OneToOne)、一对多(@OneToMany)、多对一(@ManyToOne)和多对多(@ManyToMany)。例如,用户与角色的关系: ```java @ManyToOne @JoinColumn(name...

    Hibernate-annotations-3.4最新版本

    比如,@OneToOne、@OneToMany、@ManyToOne和@ManyToMany分别用于表示一对一、一对多、多对一和多对多的关系。这些注解允许我们轻松地定义实体之间的关联,进一步简化了数据模型的设计。 在实际应用中,Hibernate-...

    hibernate-annotations-3.4.0.GA+hibernate-distribution-3.3.2.GA-dist

    《深入理解Hibernate 3.3.2与Annotations 3.4.0:核心特性与实践应用》 Hibernate作为Java领域中的一个强大ORM(对象关系映射)框架,为开发者提供了在Java应用程序中操作数据库的强大工具。它允许我们将数据库操作...

    Hibernate3.2 Annotations中文文档

    在Hibernate 3.2版本中,引入了Annotations特性,这是一种更加简洁、直观的方式来描述对象与数据库表之间的映射关系,取代了之前的XML配置文件。这个文档提供了详细的中文指南,帮助开发者理解和应用Hibernate 3.2的...

    hibernate-annotations-3.4.0.jar

    总之,`hibernate-annotations-3.4.0.jar`是Hibernate ORM的重要组成部分,它通过注解的方式将Java类与数据库表紧密联系在一起,实现了高度的代码驱动,降低了数据库操作的复杂性,提高了开发效率。在实际项目中,...

    hibernate_annotations.rar

    `hibernate_annotations.pdf`文档应该详细介绍了这些注解的用法、配置选项以及最佳实践,对于理解和使用Hibernate进行数据库操作非常有帮助。深入学习和掌握Hibernate注解,能有效提高开发效率,减少出错可能性,...

    hibernate_annotations翻译文档

    ### Hibernate Annotations 翻译文档知识点解析 #### 一、文档概述 本文档是一份关于Hibernate Annotations的中文翻译资料,其版本为3.2.0CR1。此文档旨在为中文用户理解Hibernate Annotations提供帮助,并且它是...

Global site tag (gtag.js) - Google Analytics