Hibernate4一对一关系映射(共享主键方式)

示例:一个人(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
        (?, ?)

 

 

你可能感兴趣的:(Hibernate)