上一篇介绍了Hibernate的双向一对多关系,接下还是用代码介绍一下Hibernate进阶之双向一对一关系映射。
首先做一下总结:
二)双向一对一关系【人 和身份证】 ,也可以要外键,也可以不要外键 ,一般在物品一方放置外键
Person.hbm.xml文件
<one-to-one name="card" class="Card" cascade="all"/>
Card.hbm.xml文件
<one-to-one name="person" class="Person" constrained="true"/>
(1)保存人,级联保存身份证
(2)查询人,对象导航查询身份证
注意:由于主键和外键重复,所以把主键当做外键。例如:
Person表
id name age
1 小明 14
2 小海 17
Card表
id cardno location person_id
1 28838389 广东 1
2 55322223 广西 2
因此 person_id这一列可以省略掉。
第一步:在mysql数据库中创建数据库如下;
create table person2(
id int(5) primary key auto_increment,
name varchar(255),
age int(5)
);
create table card(
id int(5) primary key auto_increment,
cardno varchar(255),
location varchar(255),
constraint card_person_FK foreign key(id) references person2(id)
);
第二步,写实体类:Person,Card。
Person类:
package example.one2one_double;
import java.io.Serializable;
/**
* 人:单方
* @author Administrator
*
*/
public class Person implements Serializable{
private Integer id;
private String name;
private Integer age;
private Card card;//关联属性
public Card getCard() {
return card;
}
public void setCard(Card card) {
this.card = card;
}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public Person() {
// TODO Auto-generated constructor stub
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Card类:
package example.one2one_double;
/**
* 身份证:单方
* @author Administrator
*
*/
public class Card {
private Integer id;
private String cardNo;
private String location;
private Person person;//关联属性
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
public Card(){}
public Card(String cardNo, String location) {
super();
this.cardNo = cardNo;
this.location = location;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCardNo() {
return cardNo;
}
public void setCardNo(String cardNo) {
this.cardNo = cardNo;
}
public String getLocation() {
return location;
}
public void setLocation(String location) {
this.location = location;
}
}
第三步,配置映射文件PersonCard.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">
<hibernate-mapping package="example.one2one_double">
<!--Person类的一方 -->
<class name="Person" table="person2">
<id name="id" column="id" type="int">
<generator class="native"></generator>
</id>
<property name="name" column="name" type="string"></property>
<property name="age" column="age" type="int"></property>
<!--
·<one-to-one >标签认识:
name属性表示关联的属性名
class表示关联的属性的类型
-->
<one-to-one name="card" class="Card" cascade="all"></one-to-one>
</class>
<!-- Card类的一方 -->
<class name="Card" table="card">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="cardNo" column="cardno"></property>
<property name="location" column="location"></property>
<!--
·<one-to-one >标签认识:
name属性表示关联的属性名
class表示关联的属性的类型
constrained表示主键是否有外键约束
constrained=false表示主键没有外键约束
constrained=true表示主键有外键约束
-->
<one-to-one name="person" class="Person" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
第四步,写测试类PersonCardDao:
PersonCardDao类:
package example.one2one_double;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import example.utils.HibernateUtils;
public class PersonCardDao {
/**
* 保存人,级联保存身份证
*/
@Test
public void test01(){
Person person=new Person("小宁",17);
Card card=new Card("20309393030","广东");
//设置双向关联
person.setCard(card);
card.setPerson(person);
Session session=HibernateUtils.getSession();
Transaction t=session.getTransaction();
try{
t.begin();
session.save(person);
t.commit();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
t.rollback();
}
}
/**
* 查询人,对象导航查询身份证
*/
@Test
public void test02(){
Session session=HibernateUtils.getSession();
Transaction t=session.getTransaction();
try{
t.begin();
Person p=(Person) session.get(Person.class, 1);
Card card=p.getCard();
System.out.println(card.getCardNo()+","+card.getLocation());
t.commit();
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
t.rollback();
}
}
}
运行结果:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select person0_.id as id2_1_, person0_.name as name2_1_, person0_.age as age2_1_, card1_.id as id3_0_, card1_.cardno as cardno3_0_, card1_.location as location3_0_ from person2 person0_ left outer join card card1_ on person0_.id=card1_.id where person0_.id=?
20309393030,广东