日期:2014-05-16  浏览次数:20579 次

一对一主键双向关联(在数据库层控制级联删除)

--数据库oracle

在数据库设计里,one-to-one模型可以用2种方法来实现。
1,主键关联:这时候要保证2个表的主键具有完全相同的值。
2,外键关联:其中一个表使用外键关联另一个表。

模型:person vs idcard (人:身份证)

--这是带主外键关联的两张表。
-- 删除表
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) REFERENCES person(id) ON DELETE CASCADE,
?serial VARCHAR2(18) NOT NULL ,
?expiry NUMBER
) ;

2、pojo类
public class Person {
?private String id ;//perosn的id
?private String name;//名字
?private int? age;?? //年龄
?
?private IdCard idcard;
}

public class IdCard {
?private String id;//卡号
?private String serial;//卡的号码
?private int expiry;//可以使用年限
}

3、添加和删除的测试类。
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 void delete(String id)
?{
??String hql = "DELETE FROM Person WHERE id=?" ;
??Query q = this.session.createQuery(hql) ;
??q.setString(0, id) ;
??q.executeUpdate() ;
??this.session.beginTransaction().commit() ;
?}

?/**
? * @param args
? */
?public static void main(String[] args) {
??PersonIdCardOperation po = new PersonIdCardOperation();
??Person per = new Person() ;
??per.setName("jack");
??per.setAge(25);

//???????? 准备好一张身份证
??IdCard ic = new IdCard();
??ic.setSerial("888888888888888");
??ic.setExpiry(12);
??
??
??per.setIdcard(ic);
??ic.setPerson(per);

//??po.insert(per) ;
??po.delete("ff8080812887f59c012887f59d080001");
?}

}

4、person配置文件
<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对象。-->
?
??<one-to-one name="idcard"
???class="org.onetoone.com.IdCard"
???cascade="all"
???outer-join="true" >
??</one-to-one>
?</class>
</hibernate-mapping>
5、idCard配置文件
<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>

??<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>

6、总结一些属性的用法。
?? person配置文件中的一些属性:
?? 1、class="uuid.hex" 用uuid.hex会自动生成的一个32位值。
?? 2、cascade="all" 解释一下cascade的用法:
????? all :所有情况下均进行关联操作,all 的意思是save-update + delete 。
????? none:所有情况下均不进行关联操作。这是默认值。
????? save-update:在执行save/update/saveOrUpdate时进行关联操作。
????? delete:在执行delete时进行关联操作。
?
????? all-delete-orphan 的意思是当对象图中产生孤儿节点时,在数据库中删除该节点

?