hibernate关联关系

一、一对多的关联配置

数据库:主表、从表,通过外键关联

执行OrderDaoTest类中的代码,找到订单id为7的订单:

public void testGet() {
		Order order = new Order();
		order.setOrderId(7);
//		order.setInitOrderItems(1);
		Order o = this.orderDao.get(order);
		System.out.println(o.getOrderNo());
//		System.out.println(o.getOrderItems());
	}

 报错原因:未找到Order这个类,没有把这个文件放入hibernate.cfg.xml文件中

<mapping resource="com/zking/two/entity/Order.hbm.xml" /> 
         <mapping resource="com/zking/two/entity/OrderItem.hbm.xml" />

得到结果: 

 

 二、懒加载(hibernate默认)

执行OrderDaoTest类中的代码,查到订单表里的所有订单项

报错:懒加载初始化失败,因为orderItems订单项在初始化的时候,session已关闭 

解决方案:

public void testGet() {
		Order order = new Order();
		order.setOrderId(7);
		order.setInitOrderItems(1);
		Order o = this.orderDao.get(order);
//		System.out.println(o.getOrderNo());
		System.out.println(o.getOrderItems());
	}

由于在Order类中定义了加载方式,所以在上代码中设置为1

private Integer initOrderItems = 0;//0代表懒加载,1代表强制加载

OrderDao:

public Order get(Order order) {
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Order o = session.get(Order.class, order.getOrderId());
//		并且想要查询出关联的订单项的数据是,采用强制加载
		if(o != null && new Integer(1).equals(order.getInitOrderItems())) {
			Hibernate.initialize(o.getOrderItems());
		}
		
		transaction.commit();
		session.close();
		return o;
	}

得出的结果:

性能调优(解释了hibernate默认采用懒加载的原因)

实际场景:

        1、只使用订单表的数据——希望懒加载

        2、需要同时使用订单以及当单项表数据——不希望懒加载

 三、一对多的子关联

 sql语句分析:

--查询出权限管理节点的相关信息
SELECT * FROM t_hibernate_sys_tree_node where 
tree_node_id=6;
--当前节点的父节点信息(当前节点的父id是父节点的id)
SELECT * FROM t_hibernate_sys_tree_node where 
tree_node_id=1;
--当前节点的子节点信息(当前节点的id是子节点的父id)
SELECT * FROM t_hibernate_sys_tree_node where 
parent_node_id=6;

需要同时获取到当前节点以及当前节点的父节点的相关信息

TreeNodeDaoTest:

public void testLoad() {
		TreeNode treeNode = new TreeNode();
		treeNode.setNodeId(6);
		treeNode.setInitChildren(1);
		
		TreeNode t = this.treeNodeDao.load(treeNode);
		System.out.println(t);
		System.out.println(t.getParent());
		System.out.println(t.getChildren());
	}

得到结果:

四、多对多的相关配置

book.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>
	<class name="com.zking.two.entity.Book" table="t_hibernate_book">
<!-- 		<cache usage="read-only" region="com.zking.five.entity.Book"/> -->
		<id name="bookId" type="java.lang.Integer" column="book_id">
			<generator class="increment" />
		</id>
		<property name="bookName" type="java.lang.String"
			column="book_name">
		</property>
		<property name="price" type="java.lang.Float"
			column="price">
		</property>
		
		<!--
        table:中间表,中间表的数据由框架维护
        name:关联属性
        inverse:(true)反转,也就是中间表的数据由另一张表维护。
                        (false)也就是中间表的数据由自己维护
                        两张表都是false时,数据会产生两条
                        两张表都是true时,数据不会产生
                        一张表为false,一张表为true,数据能够正常维护的

                        key:当前表的主键在中间表的外键

                        many-to-many:当前表的主键在中间表查出另一表的外键
          -->
		
		<set table="t_hibernate_book_category" name="categories" cascade="save-update" inverse="false">
			<!-- one -->
			<key column="bid"></key>
			<!-- many -->
			<many-to-many column="cid" class="com.zking.two.entity.Category"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值