14 多对一关联关系的映射与原理分析

来源:互联网 发布:杂志软件哪个好 编辑:程序博客网 时间:2024/05/17 01:26
关联映射
------------------------------------------------
- 多对一(Employee-Deapartment)
- 一对多(Department-Employee)
- 一对一(person-idCard)
- 多对多(teacher-student)
- 组件映射(User-Name)
- 集合映射(set,list,map,bag)
- inverse和cascade(Employee-Department)

------------------------------------------------
多对一(Employee-Department)
映射文件

<many-to-one name="depart" column="depart_id">



------------------------------------------------
对象:
//部门(主表)
public class Department{
    private int id;
    private String name;
}

//员工(副表)
public class Employee{
    private int id;
    private String name;
//    private in departid;  //外键
    private Department depart;  //对象之间的导航
}

------------------------------------------------
映射文件:
Department.hbm.xml

<hibernate-mapping>
    package="cn.itcast.hibernate.domain"

    <class name="Department"    
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
    </class>
</hibernate-mapping>


Employee.hbm.xml

<hibernate-mapping>
    package="cn.itcast.hibernate.domain"

    <class name="Employee"    
        <id name="id">
            <generator class="native"/>
        </id>
        <property name="name"/>
        <many-to-one name="depart" column="depart_id"/>
    </class>
</hibernate-mapping>

-------------------------------------------------
many-to-one:
property的标签下的name处理:从表中将name字段直接赋
给对象的name属性就完了。 对于many-to-one不是简单
的将depart_id赋给depart属性。

它会根据name="depart"
通过反射得到depart类型,然后找到depart的映射文件,
进而得到depart对象

column="depart_id" 为缺省id,默认为depart表中的主键。

如果想让其他列为主键(比如name)
<many-to-one name="depart" column="depart_id" property-ref="name">


static Department add(){
    Session s=null;
    Transaction tx=null;
    try{
        Department dpart=new Department();
        separt.setName("depart name");

        Employee emp=new Employee();
        emp.setDepart(depart);//两表建立关联
        emp.setName("emp name");

        s=HibernateUtil.getSession();
        tx=s.beginTransaction();
        s.save(depart);
        s.save(emp);
        tx.commit();
    }finally{
        fi(s!=null)
            s.close();
    }
}

输出sql
Hibernate:insert into Department(name) values(?)
Hiberante:insert into Employee(name,dpart_id) values(?,?)

------------------------------------------------
将        s.save(depart);
        s.save(emp);   倒换:


输出sql
Hibernate:insert into Employee(name,depart_id) values(?,?)
Hibernate:insert into Department(name) values(?)

Hibernate:update Employee set name=?,depart_id=?where id=?


0 0
原创粉丝点击