双向一对一关联映射原理:
双向的主键关联其实是单向一对一主键关联的一种特殊情况,只不过要在关联对象的两端的映射文件中都要进行
这里同样使用Person和IdCard来讨论,一个人对应着一个唯一的身份证,而且一个身份证也唯一映射着一个人,所以这就产生了双向的关联关系,Person的主键同样也是IdCard的主键,分别是主键的同时也是外键,这种关联关系成为双向一对一映射,表现到关系模型中可如下图:
(1)XML版
SQL文件:
CREATE TABLE `person` (
`id` varchar(255) NOT NULL,
`pname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `idcard` (
`id` varchar(255) NOT NULL,
`cardnum` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Person类:
package Hibernate_demo1.Demo11.Entity;
public class Person {
private String id;
private String pname;
private IdCard idcards;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public IdCard getIdcards() {
return idcards;
}
public void setIdcards(IdCard idcards) {
this.idcards = idcards;
}
}
IdCard类:
package Hibernate_demo1.Demo11.Entity;
public class IdCard {
private String id;
private String cardNum;
private Person persons;
public Person getPersons() {
return persons;
}
public void setPersons(Person persons) {
this.persons = persons;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCardNum() {
return cardNum;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
}
双向一对一唯一外键映射关键映射代码——在IdCard端新加入如下标签映射:
注意:一对一唯一外键关联双向采用
package Hibernate_demo1.Demo11;
import org.hibernate.Session;
import Hibernate_demo1.Demo11.Entity.IdCard;
import Hibernate_demo1.Demo11.Entity.Person;
import Hibernate_demo1.Demo11.Util.HibernateUtils;
public class App
{
public static void main( String[] args )
{
Session session = null;
try{
session = HibernateUtils.getSession();
session.beginTransaction();
//创建person对象,并保存
Person person=new Person();
person.setPname("fendo");
session.save(person);
//创建idCard对象,并保存
IdCard idcard=new IdCard();
idcard.setCardNum("123456789");
idcard.setPersons(person);
session.save(idcard);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
}
Hibernate:
insert
into
person
(pname, id)
values
(?, ?)
Hibernate:
insert
into
IdCard
(cardNum, id)
values
(?, ?)
Person表
idcard表
示例: http://download.csdn.net/detail/u011781521/9834854
(2)注解版
Person类:
package Hibernate_demo1.Demo12.Entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="person")
public class Person {
@Id
@GenericGenerator(name="uuidGenerator", strategy="uuid")
@GeneratedValue(generator="uuidGenerator")
private String id;
@Column(name="pname")
private String pname;
@OneToOne(cascade=CascadeType.ALL)
@PrimaryKeyJoinColumn
private IdCard idcards;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPname() {
return pname;
}
public void setPname(String pname) {
this.pname = pname;
}
public IdCard getIdcards() {
return idcards;
}
public void setIdcards(IdCard idcards) {
this.idcards = idcards;
}
}
IdCard类:
package Hibernate_demo1.Demo12.Entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.PrimaryKeyJoinColumn;
import javax.persistence.Table;
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name="idcard")
public class IdCard {
@Id
@GenericGenerator(name="uuidGenerator", strategy="uuid")
@GeneratedValue(generator="uuidGenerator")
private String id;
@Column(name="cardNum")
private String cardNum;
@OneToOne
@PrimaryKeyJoinColumn
private Person persons;
public Person getPersons() {
return persons;
}
public void setPersons(Person persons) {
this.persons = persons;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCardNum() {
return cardNum;
}
public void setCardNum(String cardNum) {
this.cardNum = cardNum;
}
}
测试类:
package Hibernate_demo1.Demo12;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import Hibernate_demo1.Demo12.Entity.IdCard;
import Hibernate_demo1.Demo12.Entity.Person;
public class App
{
public static void main( String[] args )
{
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.getCurrentSession();
Transaction tx = session.beginTransaction();
//创建person对象,并保存
Person person=new Person();
person.setPname("fendo");
session.save(person);
//创建idCard对象,并保存
IdCard idcard=new IdCard();
idcard.setCardNum("123456789");
idcard.setPersons(person);
session.save(idcard);
tx.commit();
session.close();
}
}
Hibernate:
insert
into
person
(pname, id)
values
(?, ?)
Hibernate:
insert
into
idcard
(cardNum, id)
values
(?, ?)