一、下面的代码可以运行。
1、数据库脚本
--oracle数据库
-- 删除表
DROP TABLE idcard ;
DROP TABLE person ;
-- 创建表
CREATE TABLE person
(
id VARCHAR2(32) PRIMARY KEY ,
name VARCHAR2(20) NOT NULL ,
age NUMBER
) ;
CREATE TABLE idcard
(
id VARCHAR2(32),
serial VARCHAR2(18) NOT NULL ,
expiry NUMBER
) ;
//2############################################
// pojo类
//类一,IdCard
package org.onetoone.com;
public class IdCard {
private String id;//卡号
private String serial;//卡的号码(共18位)
private int expiry;//可以使用年限
private Person person;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSerial() {
return serial;
}
public void setSerial(String serial) {
this.serial = serial;
}
public int getExpiry() {
return expiry;
}
public void setExpiry(int expiry) {
this.expiry = expiry;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
// pojo类
//类二,Person
package org.onetoone.com;
public class Person {
private String id ;//perosn的id
private String name;//名字
private int age; //年龄
private IdCard idcard;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public IdCard getIdcard() {
return idcard;
}
public void setIdcard(IdCard idcard) {
this.idcard = idcard;
}
}
2、配置文件。
IdCard.hbm.xml
<hibernate-mapping>
<class name="org.onetoone.com.IdCard" table="idcard">
<!-- 引用Person的主键作为idCard的主键和外键 -->
<id name="id" column="id" type="java.lang.String">
<generator class="foreign">
<param name="property">person</param>
</generator>
</id>
<!-- constrained="true",表示idcard引用了Person主键作外键 -->
<one-to-one name="person"
class="org.onetoone.com.Person"
constrained="true">
</one-to-one>
<property name="serial" type="java.lang.String">
<column name="serial" length="18" not-null="true" />
</property>
<property name="expiry" type="java.lang.Integer">
<column name="expiry" not-null="true" />
</property>
</class>
</hibernate-mapping>
Person.hbm.xml
<hibernate-mapping>
<class name="org.onetoone.com.Person" table="person">
<id name="id" type="java.lang.String">
<column name="id" length="32" />
<generator class="uuid.hex"></generator>
</id>
<property name="name" type="java.lang.String">
<column name="name" length="20" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
<!-- 下面中的cascade="all",级联保存,删除,修改时 person对象关联的idcard对象。-->
<!-- Hibernate outer-join参数允许下列三个不同值:
auto:(默认) 使用外连接抓取关联(对象),如果被关联的对象没有代理(proxy)
true:一直使用外连接来抓取关联
false:永远不使用外连接来抓取关联
-->
<one-to-one name="idcard"
class="org.onetoone.com.IdCard"
cascade="all"
outer-join="true"
>
</one-to-one>
</class>
</hibernate-mapping>
3、测试类。PersonIdCardOperation
public class PersonIdCardOperation {
private Session session = null;
public PersonIdCardOperation() {
this.session = new Configuration().configure().buildSessionFactory()
.openSession();
}
// 先插入一个用户
public void insert(Person per) {
this.session.save(per);
this.session.beginTransaction().commit();
session.close();
}
//这个查询是用来更新或删除用的
public Person queryById(String id) {
Person per = null;
String hql = "FROM Person AS p where p.id=?";
Query q = this.session.createQuery(hql);
q.setString(0, id);
List all = q.list();
if (all.size() > 0) {
per = (Person)all.get(0);
}
return per;
}
//更新person
public void update(Person per) {
this.session.update(per);
this.session.beginTransaction().commit();
}
//删除一个person
public void delete(Person per)
{
this.session.delete(per);
this.session.beginTransaction().commit() ;
}
// 一个专门用于更新身份证的操作
public void update(IdCard ic)
{
this.session.update(ic) ;
this.session.beginTransaction().commit() ;
}
// 一个专门用于删除身份证的操作
public void delete(IdCard ic)
{
this.session.delete(ic) ;
this.session.beginTransaction().commit() ;
}
/**
* @param args
*/
public static void main(String[] args) {
PersonIdCardOperation po = new PersonIdCardOperation();
//增加 person和idcard
/* Person per =new Person();
per.setName("jack");
per.setAge(19851105);
IdCard ic = new IdCard();
ic.setSerial("ttttttt");
ic.setExpiry(44);
per.setIdcard(ic);
ic.setPerson(per);
po.insert(per) ;*/
//***************************************************
//修改 person与idcard
/* Person uper =po.queryById("ff808081289edac801289edac90e0001");
uper.setName("jack");
uper.setAge(25);
IdCard uic = uper.getIdcard();
uic.setSerial("YYYYYY");
uic.setExpiry(8);
uper.setIdcard(uic);
uic.setPerson(uper);
//update它会根据你的信息有没有变化而去更新你的信息,它自己会判断一下的。
po.update(uper); */
//***************************************************
//删除 person 与idcard
/* Person dper =po.queryById("ff808081289ed0a101289ed0a22e0001");
IdCard dic = dper.getIdcard();
dper.setIdcard(dic);
dic.setPerson(dper);
po.delete(dper); */
}
}
4、总结:这个 一对一主键双向关联(用代码控制级联删除)的 和 在数据库控制级联删除 还是有点不同的。