JPA中的一对一双向联系关系

JPA中的一对一双向关联
照样在开始实验前搭建环境:
该示例来自于itcast

这里的一对一 关系维护端JPA没有规范 可以由我们来决定关系的维护端于被维护端

第一步:
导入相关的*.jar 包

在classpath类路径下创建META-INF 文件夹在里面创建persistence.xml配置文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
version="1.0">
<!-- 以transaction-type下是 事务提交类型有两种事务:第一、本地事务(在同一个数据库中完成事务)  第二、全局事务(在不同数据库中需要在同一事务中完成不同数据库的操作)-->
<persistence-unit name="person" transaction-type="RESOURCE_LOCAL">
<properties>
<!-- 使用的方言 -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
<!-- 数据库驱动 -->
<property name="hibernate.connection.driver_class" value="org.gjt.mm.mysql.Driver" />
<!-- 数据库用户名 -->
<property name="hibernate.connection.username" value="root" />
<!-- 数据库密码 -->
<property name="hibernate.connection.password" value="liyong" />
<!-- 数据库连接url -->
<property name="hibernate.connection.url"
value="jdbc:mysql://localhost:3306/student?useUnicode=true&amp;characterEncoding=UTF-8" />
<!-- 表结构发生变化的时候更新表结构 ,表不存在是创建表-->
<property name="hibernate.hbm2ddl.auto" value="update" />
</properties>
</persistence-unit>
</persistence>

第二步:创建IDCcard.java Person.java

IDCcard.java

@Entity
public class IDCard {

private String number;
private Integer idCard;
private Person person;

public IDCard(){}
public IDCard(String number){
this.number=number;
}

@Column(nullable=false,length=18)
public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public Integer getIdCard() {
return idCard;
}
public void setIdCard(Integer idCard) {
this.idCard = idCard;
}
@OneToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH,CascadeType.PERSIST},mappedBy="card")
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}


}

Person.java



@Entity
public class Person {

private String name;
private Integer id;
private IDCard card;

public Person(){}
public Person(String name){
this.name=name;
}

@Column(length=12,nullable=false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Id @GeneratedValue(strategy=GenerationType.AUTO)
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@OneToOne(cascade={CascadeType.ALL},optional=false)
@JoinColumn(name="idcard_id")
public IDCard getCard() {
return card;
}
public void setCard(IDCard card) {
this.card = card;
}


}

第三步:编写单元测试

@Test
public void save()
{
EntityManagerFactory factor=Persistence.createEntityManagerFactory("person");
EntityManager entity= factor.createEntityManager();
entity.getTransaction().begin();
Person person=new Person("小张");
IDCard card=new IDCard("111111111111");
person.setCard(card);
entity.persist(person);
entity.getTransaction().commit();
entity.close();
factor.close();
}

第四步:运行创建表见mysql数据库

源码见附件: