示例:一个人(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语句了。