Hibernate关系映射之一对一关系

来源:互联网 发布:linux cpu绑核 编辑:程序博客网 时间:2024/05/20 18:54

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

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

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 {// Fieldsprivate 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 accessorspublic 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 {// Fieldsprivate 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 accessorspublic 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放入logindetail.setLogin(login); //login放入detailsession.save(detail); //保存detail,通过级联login信息也被保存ts.commit(); //事务提交HibernateSessionFactory.closeSession(); //关闭Session对象}}


0 0
原创粉丝点击