Hibernate-关联映射

关联映射
多对一
//emp-dept联合查询

	public void qEmp(){
		
		session=HibernateUtil.getSession();
		sql="from Emp where empNo =7788";
		Query query=session.createQuery(sql);
		List<Emp> elist=query.list();
		for(Emp e:elist){
			System.out.println("姓名:"+e.getEname()+"部门:"+e.getDept().getDeptName());			
		}
		HibernateUtil.closeSession();
	}

//采用Query.uniqueResult()方法,用Emp对象单独接收一个查询结果
//emp-dept联合查询

	public void qEmp(){
		
		session=HibernateUtil.getSession();
		sql="from Emp where empNo =7788";
		Query query=session.createQuery(sql);
		Emp e=(Emp)query.uniqueResult();

			System.out.println("姓名:"+e.getEname()+"部门:"+e.getDept().getDeptName());			
	
		HibernateUtil.closeSession();
	}

一对多时,使用标签给外键设置级联关系

<set name="emps" cascade="save-update">
       <key column="deptno"></key>
      <one-to-many class="entity.Emp" />

在实体类中,使用Set集合存储多的映射对象

	private Set<Emp> emps=new HashSet<Emp>();
//dept-emp一对多中,在一中使用set存储多对象
		
		public void qDept(){
			session=HibernateUtil.getSession(); 
			sql="from Dept where deptNo =30";
			Query query=session.createQuery(sql);
		Dept d=(Dept) query.uniqueResult();
		Set<Emp> emps=d.getEmps();
		System.out.println("部门:"+d.getDeptName());
		for(Emp e:emps){
			System.out.println("员工:"+e.getEname());
		}
	
			HibernateUtil.closeSession();
		
		}	

Cascade属性值

  1. none,当Session操纵当前对象时,忽略其他关联的对象,它是cascade属性的默认值。
  2. sava-update,当通过Session的save()、update()、及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的瞬时状态的对象,并且级联更新所有关联的游离状态的对象。
  3. delete,当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。
  4. all,包含save-update、delete的行为。
    //关联关系中的cascade属性,级联添加
@org.junit.Test
	public void cascadeAdd (){
		session=HibernateUtil.getSession();
		Transaction tx=session.beginTransaction();
		Dept d=new Dept();
		d.setDeptNo(new Byte("70"));
		d.setDeptName("皇后酒店");
		d.setLocation("国王大道");
		Emp e1=new Emp(8101,"小桌子");
		Emp e2=new Emp(8102,"小凳子");
		d.getEmps().add(e1);
		d.getEmps().add(e2);
		session.save(d);
		tx.commit();
		HibernateUtil.closeSession();
	}

多对多

两张表多对多,需要一张中间表,外键关联两张表的主键
实体类只需要建两个类,中间表不需要类。

<hibernate-mapping>
	<class name="entity.Emp" table="tb_emp1" dynamic-update="true">
		<id name="eno" column="eno" type="java.lang.Integer">
			<generator class="assigned" />
		</id>
		<property name="ename" type="java.lang.String" column="ename" />
		
    <set name="pros" table="tb_proemp1"  cascade="save-update" inverse="true">
       <key column="eno"></key><!-- 对应中间表的外键 -->
      <many-to-many class="entity.Project" column="proid" />

</set>
	</class>
	
</hibernate-mapping>

<hibernate-mapping>
	<class name="entity.Project" table="tb_project1" dynamic-update="true">
		<id name="proNo" column="proid" type="java.lang.Integer">
			<generator class="assigned" />
		</id>
		<property name="proName" type="java.lang.String" column="proname" />
		
    <set name="emps" table="tb_proemp1" cascade="save-update" inverse="false">
       <key column="proid"></key>
      <many-to-many class="entity.Emp" column="eno" />

</set>
	</class>
	
</hibernate-mapping>

//总配置表中加入hbmToDdl的标签,create代表每次运行都drop数据表,重新create;update代表如果有改变就update,没有就不变

	<property name="hbm2ddl.auto">update</property>

一对一
反向工程-数据库中:
表A设置主键、外键,有外键为many方;
表B只设置主键,为one方。

<one-to-one name="resume" class="entity.Resume" property-ref="user"></one-to-one>

   <many-to-one name="user" column="CARID" class="entity.User" cascade="all" unique="true"/>

配置文件中加入序列sequence

  1. 在SQL中创建序列;
  2. 在配置文件中:
    <generator class="sequence" >
            <param name="sequence">seq_lizi</param>
            </generator>

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值