hibernate一对多,多对一的关联关…

来源:互联网 发布:电脑温度软件2017 编辑:程序博客网 时间:2024/04/28 18:00
Department.hbm.xml文件的配置 

<classname="beans.Department">
<id name="id" type="int"column="id">
          <generatorclass="native"/>
</id>
<property name="name"type="string" not-null="true"column="name"/>
<set name="employees"inverse="true">
  <keycolumn="depart_id"></key>
 <one-to-manyclass="beans.Employee"/>
</set>
<!-- 一的这方要在set中配置关联的employee中的外键及关联的实体类-->
</class>

Employee.hbm.xml文件的配置

<classname="beans.Employee">
<id name="id" type="int"column="id">
   <generatorclass="native"/>
</id>
<property name="name"type="string" column="name"/>
<property name="gender"type="string" column="gender"/>
<property name="salary"type="float" column="salary"/>
<many-to-onename="department"  column="depart_id"class="beans.Department"></many-to-one>
<!-- 多的这方也要在配置关联的外键及关联一的那方的实体类-->
</class>

public classTestOne2Many文件

public classTestOne2Many {
private static SessionFactorysessionfactory;
static{
Configuration cfg=newConfiguration();
sessionfactory=cfg.configure("hibernate.cfg.xml").addResource("beans/Employee.hbm.xml")
 .addResource("beans/Department.hbm.xml")
 .buildSessionFactory();
}
@Test
public void save(){
Sessionsession=sessionfactory.openSession();
Transaction tx= null;
try{
tx=session.beginTransaction();
Department department=newDepartment();
department.setName("行政部");
Employee employee=newEmployee();
employee.setName("mrlun");
employee.setGender("男");
employee.setSalary(4000);
  1. employee.setDepartment(department);
  2. Employee employee1=newEmployee();
  3. employee1.setName("mrlun");
  4. employee1.setGender("男");
  5. employee1.setSalary(4000);
  6. employee1.setDepartment(department);
  7. Set<Employee>set=new HashSet();
  8. set.add(employee);
  9. set.add(employee1);
  10. //department.setEmployees(set);
  11. session.save(department);
  12. session.save(employee);
  13. session.save(employee1);
tx.commit();
}catch(Exception e){
session.getTransaction().rollback();
e.printStackTrace();
}finally{
session.close();
}
         }
}
说明,多的那一放不能放弃维护关联关系,没有inverse属性,默认一的那方(Department)的inverse属性是false,即没有放弃关联关系的维护,所以,默认一的那方是维护关联关系的。
当第1,6行代码存在,而第10行代码被注释了之后,或第1,6行代码被注释,而第10行代码存在的时候,均可以实现部门和员工的成功保存。而此时由于两方都会维护关联关系,所以在先保存了部门后,再保存员工,部门id已经有了,所以只有员工这方会去维护关联关系,此时会在insert的基础上多出两条update语句。当把第11条移到13行的后面时,此时员工和部门都需要维护关联关系,所以此时会多出四条update语句。
当把一的那方的inverse设为true时,表示一的那方放弃维护关联关系,此时若注释掉1,6行,即使有第10行存在,也不会将部门id存到员工表,因为部门不能维护,而员工这方没有部门的信息,也不能维护。但此时有1,6行,注释掉第10行,则可以成功保存,因为员工这方维护了关联关系。


0 0