`
周一Monday
  • 浏览: 342638 次
  • 来自: 北京
社区版块
存档分类
最新评论

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" />
		<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语句了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics