Hibernate关系映射之一对一关系

一对一关系可用共享主键方式、唯一外键方式来实现,而本文使用共享主键方式。

第一步:创建数据库,设置好中文属性,然后创建两个表。

login表:

列名

描述

数据类型

可空

默认值

说明

ID

ID号

int(4)

主键

USERNAME

登录账号

varchar(20)

 

PASSWORD

登录密码

varchar(20)

detail表:

列名

描述

数据类型

可空

默认值

说明

ID

ID号

int(4)

主键,自增

TRUENAME

真实姓名

varchar(8)

 

EMAIL

电子邮件

varchar(50)

第二步:创建数据库连接驱动,打开MyEclipse DataBase Explorer Perspective视图,new,其中Driver Template=MySQL Connector/J,Driver Name=自定义,Connection URL=jdbc:mysql://localhost:3306/javaee?characterEncoding=gbk,User name=用户名,Password=密码。

第三步:创建Web Project,添加Hibernate开发能力(MyEclipse --> Add Hibernate Capabilites),即建立hibernate.cfg.xml文件。

第四步:创建POJO类和其映射文件,可以在打开连接后,对表使用反向工程(Hibernate Reverse Engineering)。

Login.java

package org.model;

/**
 * Login entity. @author MyEclipse Persistence Tools
 */

public class Login implements java.io.Serializable {

	// Fields

	private Integer id;
	private String username;
	private String password;
	private Detail detail; //在Login类中增加Detail的属性并实现其get/set

	// Constructors

	/** default constructor */
	public Login() {
	}

	/** full constructor */
	public Login(String username, String password) {
		this.username = username;
		this.password = password;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getUsername() {
		return this.username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return this.password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Detail getDetail() {
		return detail;
	}

	public void setDetail(Detail detail) {
		this.detail = detail;
	}

}
映射文件Login.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="org.model.Login" table="login" catalog="lab6">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <-- Login的主键生成策略为foreign即通过外键(Detail的主键)生成 -->
            <generator class="foreign">
            	<param name="property">detail</param>
            </generator>
        </id>
        <property name="username" type="java.lang.String">
            <column name="USERNAME" length="20">
            </column>
        </property>
        <property name="password" type="java.lang.String">
            <column name="PASSWORD" length="20">
            </column>
        </property>
        <-- 一对一关系的确定,cascade级联属性为all,lazy为false即立即生成 -->
        <one-to-one name="detail" class="org.model.Detail" cascade="all" lazy="false"></one-to-one>
    </class>
</hibernate-mapping>

Detail.java

package org.model;

/**
 * Detail entity. @author MyEclipse Persistence Tools
 */

public class Detail implements java.io.Serializable {

	// Fields

	private Integer id;
	private String truename;
	private String email;
	private Login login; //Detail类中增加Login的属性并实现其get/set

	// Constructors

	/** default constructor */
	public Detail() {
	}

	/** minimal constructor */
	public Detail(Integer id) {
		this.id = id;
	}

	/** full constructor */
	public Detail(Integer id, String truename, String email) {
		this.id = id;
		this.truename = truename;
		this.email = email;
	}

	// Property accessors

	public Integer getId() {
		return this.id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getTruename() {
		return this.truename;
	}

	public void setTruename(String truename) {
		this.truename = truename;
	}

	public String getEmail() {
		return this.email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public Login getLogin() {
		return login;
	}

	public void setLogin(Login login) {
		this.login = login;
	}

}
Detail.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="org.model.Detail" table="detail" catalog="lab6">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="identity" /><-- Detail的主键生成策略identity是数据库生成方式,主键必须设为自增+1 -->
        </id>
        <property name="truename" type="java.lang.String">
            <column name="TRUENAME" length="8">
            </column>
        </property>
        <property name="email" type="java.lang.String">
            <column name="EMAIL" length="50">
            </column>
        </property>
        <one-to-one name="login" class="org.model.Login" cascade="all" lazy="false"></one-to-one>
    </class>
</hibernate-mapping>

第五步:创建测试类

Test.java

package org;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.model.Detail;
import org.model.Login;
import org.util.HibernateSessionFactory;

public class Test {
	public static void main(String args[]) {
		Session session = HibernateSessionFactory.getSession(); //获得Session对象
		Transaction ts = session.beginTransaction(); //创建事务对象
		
		Detail detail = new Detail();
		Login login = new Login();
		login.setUsername("zhangsan");
		login.setPassword("123321");
		detail.setTruename("张三");
		detail.setEmail("zhangsan@163.com");
		login.setDetail(detail); //detail放入login
		detail.setLogin(login); //login放入detail
		
		session.save(detail); //保存detail,通过级联login信息也被保存
		ts.commit(); //事务提交
		HibernateSessionFactory.closeSession(); //关闭Session对象
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值