一对一关系可用共享主键方式、唯一外键方式来实现,而本文使用共享主键方式。
第一步:创建数据库,设置好中文属性,然后创建两个表。
login表:
列名 | 描述 | 数据类型 | 可空 | 默认值 | 说明 |
ID | ID号 | int(4) | 否 | 无 | 主键 |
USERNAME | 登录账号 | varchar(20) | 是 | 无 |
|
PASSWORD | 登录密码 | varchar(20) | 是 | 无 |
列名 | 描述 | 数据类型 | 可空 | 默认值 | 说明 |
ID | ID号 | int(4) | 否 | 无 | 主键,自增 |
TRUENAME | 真实姓名 | varchar(8) | 是 | 无 |
|
| 电子邮件 | varchar(50) | 是 | 无 |
第三步:创建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对象
}
}