关联映射
多对一
//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属性值
- none,当Session操纵当前对象时,忽略其他关联的对象,它是cascade属性的默认值。
- sava-update,当通过Session的save()、update()、及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的瞬时状态的对象,并且级联更新所有关联的游离状态的对象。
- delete,当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。
- 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
- 在SQL中创建序列;
- 在配置文件中:
<generator class="sequence" >
<param name="sequence">seq_lizi</param>
</generator>