Hibernate一对多与多对一关系映射

运用部门与员工之间的关系

部门(Department)中有三属性,设置get和set方法

   private int did;
private String dname;
private Set<Employee> emps;


员工(Employee)也有三个属性,分别生成get和set方法
private int eid;
private String ename;
private Department depart;


[size=medium]部门类的xml文件映射(Department.hbm.xml)[/size]

<class name="com.cao.po.Department" table="depart">
<id name="did">
<generator class="native" />
</id>
<property name="dname"/>
<!-- 映射set集合,key标签用于指定多段外键列名,需要和多端配置的many-to-one标签的列名一致 -->
<set name="emps">
<key column="depart_ids"/>
<!-- class属性用于指定集合内的类型,因为在类中定义用了泛型,所以此处也可不进行指定 -->
<one-to-many class="com.cao.po.Employee"/>
</set>
</class>



[size=medium]员工类的xml文件映射配置(Employee.hbm.xml)[/size]


<class name="com.cao.po.Employee" table="emp">
<id name="eid">
<generator class="native" />
</id>
<property name="ename"/>

<!-- 配置多对一关系,hibernate会根据name的值去实体类中找其定义的类型(此处Department depart),
然后根据其类型找该类所对应的配置文件Department.hbm.xml,建立关系,
默认的该列引用一端的id属性列作为外键值,如果想自己指定可以在标签里配置property-ref="指定的列";
-->
<many-to-one name="depart" column="depart_id" />
</class>



[size=medium]简单的添加操作[/size]


public static void add(){
Session session = HibernateUtil.getSession();
Transaction ts = HibernateUtil.getTs();

Department depart = new Department();
depart.setDname("depart1");

Employee emp1 = new Employee();
//emp和depart建立关系,如果不设置对应的外键值为空
emp1.setEname("emp1");
emp1.setDepart(depart);
Employee emp2 = new Employee();
emp2.setEname("emp2");
emp2.setDepart(depart);

//如果同时在一端也进行关系维护的话,会生成两天update语句,如果想取消一端的维护的话可以配置inverse属性
Set<Employee> eset = new HashSet<Employee>();
eset.add(emp1);
eset.add(emp2);
depart.setEmps(eset);

/*
* 必须对部门实体进行保存,因为员工表对部门表进行了引用,
* 保存时间可以早于emp,也可晚于emp,但是要在commit之前
* 两种情况会生成不同的sql语句,当保存emp早于depart时,会生成3条insert语句和2条update语句,
* 两条update语句是更新emp表的外键,因为在保存emp时depart的id为空,当再保存depart时,因为
* emp为持久化对象,所以其对应的引用值也会改变
*
* 当保存depart在emp之前是只生成3条insert语句
*/
session.save(depart);
session.save(emp1);
session.save(emp2);

ts.commit();
session.close();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值