示例:一个人(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" />
- <one-to-one name="address" class="Address" />
- </class>
- </hibernate-mapping>
- <hibernate-mapping package="org.monday.hibernate4.domain">
- <class name="Address" table="tbl_address">
- <id name="id">
- <generator class="foreign">
- <param name="property">person</param>
- </generator>
- </id>
- <property name="detail" />
- <one-to-one name="person" class="Person" constrained="true" />
- </class>
- </hibernate-mapping>
1、Address的主键生成策略使用foreign方式,表示通过外键与Person对象共享标识符属性。
2、<one-to-one>标签的constrained属性设置为true,表示约束Address对象的标识符属性值必须与
person属性所对应的持久化对象的标识符属性相同。
用@Annotation映射
- @Entity
- @Table(name = "tbl_person")
- public class Person {
- @Id
- @GeneratedValue(strategy = GenerationType.IDENTITY)
- private Integer id;
- private String name;
- @OneToOne
- @PrimaryKeyJoinColumn
- private Address address;
- // getter and setter
- }
- @Entity
- @Table(name = "tbl_address")
- public class Address {
- @Id
- @GeneratedValue(generator = "myForeignGenerator")
- @GenericGenerator(name = "myForeignGenerator",
- strategy = "foreign",
- parameters = @Parameter(name = "property", value = "person"))
- private Integer id;
- private String detail;
- @OneToOne(optional = false)
- @PrimaryKeyJoinColumn
- private Person person;
- // getter and setter
- }
@OneToOne的optional=false表示在address这端添加一个外键约束
@PrimaryKeyJoinColumn定义了一对一关联
测试代码
- 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:
- create table tbl_address (
- id integer not null,
- detail varchar(255),
- primary key (id)
- )
- Hibernate:
- create table tbl_person (
- id integer not null auto_increment,
- name varchar(255),
- primary key (id)
- )
- Hibernate:
- alter table tbl_address
- add index FKD0C46473E8935A42 (id),
- add constraint FKD0C46473E8935A42
- foreign key (id)
- references tbl_person (id)
- Hibernate:
- insert
- into
- tbl_person
- (name)
- values
- (?)
- Hibernate:
- insert
- into
- tbl_address
- (detail, id)
- values
- (?, ?)