一对一配置

发表时间:2017-05-17 17:28:05 浏览量( 38 ) 留言数( 0 )

学习目标:

学习目标:

1、了解hibernate一对一的配置和使用



学习过程:

一对一配置

一对一的配置相对简单得多,其实在数据库的实现中一对一就是一对多的特殊形式,在hibernate中有专门的标签配置一对一的关系,实现也比较简单。

在上面的表设计中账号和员工表是一种一对一的关系,hibernate也支持这种关系,事实上一对一只是一种一对多的特殊情况,就是在多方在添加一个唯一性约束就可以实现了。但是hibernate对一对一有专门的配置方法。

1、修改javaBean的属性

首先修改pojo的属性,在员工和账号都分别添加对象。员工类如下:

public class Employee implements java.io.Serializable {

	private Integer employeeId;
	private Post post;// 多对一
	private String employeeName;
	private Login login;//一对一
	
	//下面省略get/set方法

账号类如下:

public class Login implements java.io.Serializable {
	private Integer loginId;
	private Employee employee;// 一对一
	private String loginName;
	private String loginPass;
	//下面省略get/set方法

2、修改配置文件

因为在表设计的时候,我们采用的模式是员工表是主表,而账号表是从表,也就是说账号表参考员工表。上面也说过了,一对一就是一对多的特殊情况,所以我们在配置账号表的时候还是可以使用mang-to-one的标签。

修改Login.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">
 

<hibernate-mapping>
    <class name="com.javadayup.stuormrelate.Login" table="login" catalog="hbm_db">
        <id name="loginId" type="java.lang.Integer">
            <column name="login_id" />
            <generator class="native" />
        </id>
        <property name="loginName" type="java.lang.String">
            <column name="login_name" length="200" />
        </property>
        
        <property name="loginPass" type="java.lang.String">
            <column name="login_pass" length="200" />
        </property>
        
		 <many-to-one name="employee" class="com.javadayup.stuormrelate.Employee" unique="true" >
		            <column name="employee_id" />
		 </many-to-one>
    </class>
</hibernate-mapping>

修改Employee.hbm.xml的配置文件如下

<one-to-one name="login"  property-ref="employee"  cascade="all"></one-to-one>

3、测试

public class Run2 {
	public static void main(String[] args) {
		Session session = HibernateUtil.getSessionFactory().getCurrentSession();
		// 现在在内存
		 // 添加员工的同时添加账号
		 
        Post post = new Post();
        post.setPostId(2);
 
        Employee employee = new Employee();
        employee.setEmployeeName("刘宝那个");
        employee.setPost(post);
        
        Login login = new Login();
        login.setLoginName("liu");

        employee.setLogin(login);
        
        // 开启一个事务
        session.beginTransaction();
 
        // 操作数据库 直接操作对象 持久化
        session.save(employee);
 
        // 提交事物
        session.getTransaction().commit();
        
        session.close();
        
        HibernateUtil.getSessionFactory().close();
     
	}
}

   虽然感觉我们也只是保存employee信息,但是因为员工信息和登陆信息已经建立了关系,所以我们查看输出的sql,再打开数据库查看是否员工信息和登陆信息表都插入了数据,并且关系也建立了。hibernate就是这么神奇。

Hibernate: insert into hbm_db.employee (employee_name, post_id) values (?, ?)

Hibernate: insert into hbm_db.login (login_name, login_pass, employee_id) values (?, ?, ?)