示例:一个人(person) 住一个地址(address),一个地址有一个人。
public class Person { private Integer id; private String name; private Address address; //getter and setter }
public class Address { private Integer id; private String detail; private Person person; //getter and setter }
用XML映射
<hibernate-mapping package="org.monday.hibernate4.domain"> <class name="Person" table="tbl_person"> <id name="id"> <generator class="identity" /> </id> <property name="name" /> <many-to-one name="address" class="Address" column="address_id" unique="true"/> </class> </hibernate-mapping>
<hibernate-mapping package="org.monday.hibernate4.domain"> <class name="Address" table="tbl_address"> <id name="id"> <generator class="identity"/> </id> <property name="detail" /> <one-to-one name="person" class="Person" property-ref="address" /> </class> </hibernate-mapping>
1、 tbl_address 表中使用外键来完成一对一关联,限制多方最多只能有一条记录参考到一方,
这是多对一的一个特列。所以设置 <many-to-one> 的 unique 的属性为 true 。
2、 <one-to-one> 的 property-ref 属性 指定引用关联类的属性。
用@Annotation映射
@Entity @Table(name = "tbl_person") public class Person { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; @OneToOne @JoinColumn(name = "address_id", unique = true) private Address address; // getter and setter }
@Entity @Table(name = "tbl_address") public class Address { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String detail; @OneToOne(mappedBy = "address") private Person person; // getter and setter }
测试代码
Person person = new Person(); person.setName("monday"); Address address = new Address(); address.setDetail("shanghai"); person.setAddress(address); address.setPerson(person); session.save(person); session.save(address);
SQL schema
Hibernate: alter table tbl_person drop foreign key FKACCC46F65DCD05A8 Hibernate: drop table if exists tbl_address Hibernate: drop table if exists tbl_person Hibernate: create table tbl_address ( id integer not null auto_increment, detail varchar(255), primary key (id) ) Hibernate: create table tbl_person ( id integer not null auto_increment, name varchar(255), address_id integer unique, primary key (id) ) Hibernate: alter table tbl_person add index FKACCC46F65DCD05A8 (address_id), add constraint FKACCC46F65DCD05A8 foreign key (address_id) references tbl_address (id) Hibernate: insert into tbl_person (name, address_id) values (?, ?) Hibernate: insert into tbl_address (detail) values (?) Hibernate: update tbl_person set name=?, address_id=? where id=?
这里多了一条update语句,是因为插入顺序决定的。
若这样
session.save(address); session.save(person);
就不会有update语句了。