Hibernate 映射2

1.2 一对多 即两个表通过外键进行关联,一个部门,多个员工;一个学校,多个学生;这里的两个表通过外键关联

public class Department {
private int deptid;
private String dname;
private String location;
private Set<Employee> employees=new HashSet<Employee>(); //这里是一个集合 一个部门有多个 员工 即"多"
}

public class Employee {
private int empid;
private String ename;
private Department department; //而对每个员工来说只有一个部门 即 "一"
}

我们先按我们的思路想下配置文件 有一个Department对应{Employee..}也就是many 个Employee 对应一个
Department 并且有many个外键
<hibernate-mapping
package="com.bjsxt.po">
<class name="Employee" table="t_employee" >
<id name="empid">
<generator class="native"></generator>
</id>
<property name="ename"></property>
<many-to-one name="department" class="Department" cascade="all" >
<column name="dept_id"></column> <!-- 这个就是我们前面说到的多个外键--!>
</many-to-one>
</class>
</hibernate-mapping>
而Department类中不是有一个set 的集合吗 所以用到set

<hibernate-mapping package="com.bjsxt.po">
<class name="Department" table="t_department" >
<id name="deptid">
<generator class="native"></generator>
</id>
<property name="dname"></property>
<property name="location"></property>
<set name="employees" cascade="save-update" inverse="false" >
<key>
<column name="dept_id"></column> <!-- 对应employee中的一个列 --!>
</key>
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
其中cascade 属性和inverse 属性比较重要
cascade 属性是级联的操作,比如我们增加一个员工时同时对该员工的部门设置了值.如果数据库中没有记录.则
强大的Hibernate 会为我们创建表,并添加记录并建立关系。当然这些只是我们上面配置的文件的作用.
cascase = all 进行任何操作时都级联
save-update 保存和更新时
delete 删除时级联
all-delete-orpnan 当被关联对象失去宿主时,将其删除 也就是如果我们把部门删除了,那么员工自然就没有家可回了,会被一并删除 特别注意如果此属性不设置,则会报错
inverse 属性 =false =true 表示由哪一方维护外键的值 false是双方都可以维护,true是有多方维护 .true效率高
最后,终于要说多对多的情况了 首先我们应该知道,多对多就会产生中间表,而中间表肯定有两个表的字段
1.n
public class Student2 {
private int id;
private String name;
private Set courses=new HashSet(); //这里是一个set的集合了, 学生可以有多门课程
}

public class Course {
private Long id;
private String name;
private Set students =new HashSet(); //课程也可以被多个同学选修
}

这里我们假设没有hibernate 帮我们的情况下,我们应该自己建立一个中间表 student_course
表中自然有student_id,course_id 如果我们这样想的话。那么配置文件一看就明白

<hibernate-mapping package="com.bjsxt.po">
<class name="Student2" table="t_student2" lazy="true">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<!-- set 出现了,表为stu_course 即为中间表--!>
<set name="courses" table="stu_course" cascade="save-update">
<key column="stuId" /> <!-- key 对应当前表的外键 --!>
<many-to-many class="Course" column="courseId" />
</set>
</class>
</hibernate-mapping>
此时我们应该猜想Course.hbm.xml应该和这个一样,只是一些小小的差别
<hibernate-mapping package="com.bjsxt.po">
<class name="Course" table="t_course" lazy="true">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"/>
<set name="students" table="stu_course" cascade="save-update">
<key column="courseId" /> //t_sourse的外键
<many-to-many class="Student2" column="stuId" />
</set>
</class>
</hibernate-mapping>

基础上一些大的我们已经配置完了。当然这些都可以在网上查到。但最少我们应该知道怎么配。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值