Hibernate之对象关系映射06一对一双向外键关联

来源:互联网 发布:snmp及编程实现 编辑:程序博客网 时间:2024/05/16 13:50


一对一外键关联是一对多外键关联的特例,只是在多的一方加了个唯一性约束。

Address11fk_sx.java

private int addressId;private String detailAddress;private Person11fk_sx person11fk_sx;

Person11fk_sx.java

private int personId;private String personName;private int age;private Address11fk_sx Address11fk_sx;

表结构:

-- 一对一双向外键关联 地址表的person_id外键关联 person_11fk_sx的person_idDROP TABLE IF EXISTS address_11fk_sx;create table address_11fk_sx (    address_id int(11) PRIMARY KEY auto_increment,    detail_address varchar(255),    person_id int(11)) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- 一对一双向外键关联 人员表DROP TABLE IF EXISTS person_11fk_sx;create table person_11fk_sx (    person_id int(11) PRIMARY KEY auto_increment,    person_name varchar(24) not null comment '姓名',    age int(3)) ENGINE=InnoDB DEFAULT CHARSET=utf8;ALTER TABLE address_11fk_sx add constraint fk_11fk_address FOREIGN KEY(person_id) REFERENCES person_11fk_sx(person_id);

Address11fk_sx.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>  <class name="com.ack.hibernateMapping.entity.Address11fk_sx" table="address_11fk_sx"><id name="addressId" column="address_id"><generator class="identity"/></id><property name="detailAddress" column="detail_address"/><many-to-one name="person11fk_sx"   class="com.ack.hibernateMapping.entity.Person11fk_sx"       column="person_id"       fetch="select"       unique="true" />  </class></hibernate-mapping>

Person11fk_sx.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>  <class name="com.ack.hibernateMapping.entity.Person11fk_sx" table="person_11fk_sx"><id name="personId" column="person_id"><generator class="identity"/></id><property name="personName">  <column name="person_name" length="24" not-null="true">         <comment>姓名</comment>       </column></property><property name="age"/><one-to-one name="address11fk_sx" cascade="all" />  </class></hibernate-mapping>

测试类:

public class Test_pa_11fk_sx {public static void main(String[] args) {Person11fk_sx p1 = new Person11fk_sx();p1.setPersonName("陈三");Address11fk_sx add1 = new Address11fk_sx();add1.setDetailAddress("丽水市莲都区");p1.setPersonId(1);p1.setAddress11fk_sx(add1);add1.setPerson11fk_sx(p1);Session session = HibernateUtil.getCurrentSession();session.beginTransaction();session.save(p1);session.getTransaction().commit();}}

sql语句:

insert into person_11pk_sx(person_name, age) values(?, ?)insert into address_11pk_sx(detail_address, address_id) values(?, ?)
person生成记录的时候会生成一条address的记录。

0 0