• Hibernate入门:关联规则之多对一和一对多


    多对一规则:比如Employee和Department,多个Employee对应一个Department,称为多对一;
    一对多规则:比如Department和Employee,一个Department对应多个Employee,称为一对多;


    一对多的规则:

    public class Department {
    	private int id;
    	private String name;
    	private Set<Employee> emps;	//此为一对多 
    	getter setter...
    }
    



    public class Employee {
    	private int id;
    	private String name;
    	getter setter...
    }
    


    在Department.hbm.xml中设置:

    <set name="emps">
            <key column="depart_id"></key>	<!-- 因为集合属性不可能存储在这张表中,需要另开一张表,所以需要指定存储此集合的表用于连接department表的id属性的外键 -->
            <!-- depart_id为Employee表中需要和Department表的id相关联的属性 -->
            <one-to-many class="Employee"/><!-- 指定一对多对应的表 -->
    </set>

    一对多规则设置以后,在Department中是没有任何变化的,变化是在Employee中多出了一个depart_id属性;


    多对一规则:


    public class Department {
    	private int id;
    	private String name;
    	getter setter...
    }
    


    package org.xiazdong;
    
    public class Employee {
    	private int id;
    	private Department depart;	//此为多对一,通过Department对象引用Department
    	private String name;
    	getter setter...
    }
    

    Employee.hbm.xml中设置:

    <many-to-one name="depart" column="depart_id" />	<!-- 设置在Employee中有一个depart_id和Department的主键相关联-->


    实例:


    Employee.java

    package org.xiazdong;
    
    public class Employee {
    	private int id;
    	private Department depart;	//此为多对一
    	private String name;
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public Department getDepart() {
    		return depart;
    	}
    	public void setDepart(Department depart) {
    		this.depart = depart;
    	}
    }
    

    Department.java


    package org.xiazdong;
    
    import java.util.Set;
    
    public class Department {
    	private int id;
    	private String name;
    	private Set<Employee> emps;	//此为一对多
    	 
    	public Set<Employee> getEmps() {
    		return emps;
    	}
    	public void setEmps(Set<Employee> emps) {
    		this.emps = emps;
    	}
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    }
    

    Employee.hbm.xml


    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2012-5-17 10:59:47 by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping package="org.xiazdong">
    	<class name="Employee">
    		<id name="id">
    			<generator class="native" />
    		</id>
    		<property name="name" />
    		<many-to-one name="depart" column="depart_id" />
    	</class>
    </hibernate-mapping>
    


    Department.hbm.xml


    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <!-- Generated 2012-5-17 10:59:47 by Hibernate Tools 3.4.0.CR1 -->
    <hibernate-mapping package="org.xiazdong">
        <class name="Department">
            <id name="id">
                <generator class="native"/>
            </id>
            <property name="name"/>
            
            <set name="emps">
            	<key column="depart_id"></key>	<!-- 因为集合属性不可能存储在这张表中,需要另开一张表,所以需要指定存储此集合的表用于连接department表的id属性的外键 -->
            	<!-- depart_id为Employee表的主键,和Department表的id相关联 -->
            	<one-to-many class="Employee"/><!-- 指定一对多对应的表 -->
            </set>
        </class>
    </hibernate-mapping>
    

    执行后表为:

    Department


    Employee



    测试类:

    package test;
    
    import org.hibernate.Session;
    import org.hibernate.Transaction;
    import org.hibernate.util.HibernateUtil;
    import org.xiazdong.Department;
    import org.xiazdong.Employee;
    
    public class Many2OneTest {
    	public static void main(String[] args) {
    		add();
    		query();
    	}
    	static void query(){
    		Session session = HibernateUtil.getSession();
    		Transaction tx = session.beginTransaction();
    		Department depart = (Department) session.get(Department.class, 6);
    		Employee e = (Employee) session.get(Employee.class, 8);
    		System.out.println(depart.getEmps());
    		System.out.println(e.getDepart().getName());
    		tx.commit();
    		session.close();
    	}
    	static void add(){
    		Department depart = new Department();
    		depart.setName("depart");
    		Employee e1 = new Employee();
    		e1.setName("e1");
    		e1.setDepart(depart);
    		Employee e2 = new Employee();
    		e2.setName("e2");
    		e2.setDepart(depart);
    		
    		Session session = HibernateUtil.getSession();
    		Transaction tx = session.beginTransaction();
    		session.save(depart);
    		session.save(e1);
    		session.save(e2);
    		tx.commit();
    		session.close();
    	}
    }
    






  • 相关阅读:
    简直不敢相信...
    halcon 保存Region [原创]
    VS2015 下载链接
    C#【数据转换】十进制yte[]相互转换
    C# 复制窗体问题完美解决办法
    TextBox 保持固定长度,添加新行滚动到最后,跨线程。
    mysql isnull
    C#跨线程访问控件[我的记录]
    C# 常用类-IO-ClassExcelExport
    C# 常用类-IO-ClassXML
  • 原文地址:https://www.cnblogs.com/xiazdong/p/3058020.html
Copyright © 2020-2023  润新知