Hibernate - 2


Hibernate 关联关系映射

实现类:

/**
 * @author: RookieWangZhiWei
 * @date:2018-3-8 上午9:06:03
 * @version :
 * 
 */
public class Customer {
	private Integer id;
	private String name;
	//在1 的一方,表达持有多的一方的引用=>使用集合
	private Set<Order> orders = new HashSet<Order>();
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	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;
	}
	
	
}
/**
 * @author: RookieWangZhiWei
 * @date:2018-3-8 上午9:07:18
 * @version :
 * 
 */
public class Order {
	private Integer id;
	private String name;
	
	private Customer customer;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

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

	public Customer getCustomer() {
		return customer;
	}

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

配置文件:

Customer.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="two" >
 	<class name="Customer" table="t_customer"  >
		<id name="id" column="id"    >
			<generator class="native"></generator>
		</id> 	
		<property name="name" column="name" type="string" ></property>
 		
 		<!-- 表达一对多关系中的集合
 			name:集合的属性名称
 			inverse: 是否将关系的维护反转给对方. 默认值: false
 				   true: 在Customer 中 放弃维护外键关系
 				   
 			cascade :级联操作
 				save-update:级联保存,级联修改. 保存A时,同时保存B. 
				delete:删除A,同时删除B,AB都不存在
				delete-orphan:孤儿删除,解除关系,同时将B删除,A存在的。
				如果需要配置多项,使用逗号分隔。<set cascade="save-update,delete">
				
				all : save-update 和 delete 整合
				all-delete-orphan : 三个整合
 				
 		 -->
 		<set name="orders" inverse="false" cascade="all-delete-orphan"  >
 			<!--
 				key 用来描述外键
 				column : 外键的值
 			  -->
 			<key column="cid" ></key>
 			<!-- one-to-many 表达, Customer 与orders 的关系是一对多
 				class: 表达关联的另一方的完整类名
 			 -->
 			<one-to-many class="Order" />
 		</set>
 	</class>
 </hibernate-mapping>

Order.hbm.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package="two" >
 	<class name="Order" table="t_order"  >
		<id name="id" column="id"    >
			<generator class="native"></generator>
		</id> 	
		<property name="name" column="name" type="string" ></property>
 		
 		<!-- 表达多对一关系 
 			name: 引用的属性名称
 			column: 外键的列名
 			class: 我引用的Order的完整类名
 		-->
 		<many-to-one name="customer" column="cid" class="Customer"   ></many-to-one>
 	</class>
 </hibernate-mapping>




多对多

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package = "three">
 	<class name = "Student" table = "t_student">
 		<id name = "sid" column = "sid">
 			<generator class = "native"></generator>
 		</id>
 		
 		<property name = "sname" colume = "sname"></property>
 		<!-- 多对多关系 -->
		<!-- 
			set 表达集合
				name: 集合的属性名
				table:多对多中间表的表名
			key 表达外键
				column:引用我的外键名
			many-to-many 表达多对多
				class : 集合引用方的类型
				column:对方在中间表的外键名
		 -->
 		<set name = "courses" table = "stu_cour" inverse="false" cascade="save-update">
 			<key column = "sno"></key>
 			<many-to-many class = "Course" column = "t_course"></many-to-many>
 		</set>
 	</class>
 
 </hibernate-mapping>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
 <hibernate-mapping package = "three">
 	<class name = "Course" table = "t_course">
 		<id name = "cid" column = "cid">
 			<generator class = "native"></generator>
 		</id>
 		
 		<property name = "cname" column = "cname"></property>
 		
 		<set name = "students" table = "stu_cour" inverse="true">
 			<key column = "cno"></key>
 			<many-to-many class = "Student" column = "sno"></many-to-many>
 		</set>
 	</class>
 
 </hibernate-mapping>



抓取策略

1.检索方式

立即检索:立即查询,在执行查询语句时,立即查询所有的数据

延迟检索:延迟查询,在执行查询语句之后,在需要时在查询(懒加载)

2.类级别检索

get:立即检索,get方法一执行,立即查询所有字段的数据

load:延迟检索,默认情况,load方法执行后,如果只使用OID的值不进行查询,如果要使用其他属性值将查询 。 Customer.hbm.xml <class  lazy="true |false">

              lazy默认值true,表示延迟检索,如果设置false表示立即检索。

3.关联级别检索
3.1一对多或多对多

l  容器<set> 提供两个属性:fetch、lazy

       fetch:确定使用sql格式

       lazy:关联对象是否延迟。

l  fetch:join、select、subselect

       join:底层使用迫切左外连接

       select:使用多个select语句(默认值)

       subselect:使用子查询

l  lazy:false、true、extra

       false:立即

       true:延迟(默认值)

       extra:极其懒惰



l  fetch="join"

lazy无效。底层使用迫切左外连接,使用一条select将所有内容全部查询。

 fetch="select"

l  当前对象 和 关联对象 使用多条select语句查询。

l  lazy="false" , 立即,先查询客户select,立即查询订单select

l  lazy="true",延迟,先查询客户select,需要订单时,再查询订单select

l  lazy="extra",极其懒惰(延迟),先查询客户select, 如果只需要订单数,使用聚合函数(不查询详情)

1.1.1.1 fetch="subselect"

l  将使用子查询。注意:必须使用Query否则看不到效果。

l  lazy= 同上



3.2多对一

l  <many-to-one fetch="" lazy="">  (<one-to-one>)

l  fetch取值:join、select

       join:底层使用迫切左外连接

       select:多条select语句

l  lazy取值:false、proxy、no-proxy

       false:立即

       proxy:采用关联对象 类级别检索的策略。

              订单 关联 客户 (多对一)

              订单 立即获得 客户,需要在客户Customer.hbm.xml <class lazy="false">

              订单 延迟获得 客户,需要在客户Customer.hbm.xml <classlazy="true">



1.1.1.1 fetch="join"

l  fecth="join" select语句使用左外连接,此时lazy无效。


1.1.1.1 fetch="select"

l  将采用多条select语句,lazy="proxy"是否延迟,取决关联对象 类级别检索策略。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值