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

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一对一主键映射

    这是一对一双向主键共享方式的映射例子,可以参考一下。

    Hibernate实体映射

    :Hibernate有两种映射实体一对一关联关系的实现方式:共享主键方式和唯一外键方式。 共享主键方式: 所谓共享主键方式就是限制两个数据表的主键使用相同的值

    Hibernate高级映射实例

    Hibernate高级映射的几个单向关系,单向一对一(共享主键方式、唯一外键方式),单向多对一,单向一对多,单向多对多。

    Hibernate_Annotation关联映射

    1.共享主键的一对一关联映射: @Entity @Table(name="Test_Body") public class Body { private Integer id; private Heart heart; @Id public Integer getId() { return id; } public void setId(Integer id...

    unidirectional-one2one-sharedprimarykey:该存储库正在存储有关Hibernate映射示例的源代码-共享主键上的单向一对一关联-one source code

    单向一对一共享主键 该存储库正在存储有关Hibernate映射示例的源代码-共享主键上的单向一对一关联

    Hibernate注释大全收藏

    Hibernate注释大全收藏 声明实体Bean @Entity public class Flight implements Serializable { Long id; @Id public Long getId() { return id; } public void setId(Long id) { this.id...一对一 使用 @OneToOne...

    Hibernate实战(第2版 中文高清版)

     7.1.2 一对一的外键关联   7.1.3 用联结表映射   7.2 多值的实体关联   7.2.1 一对多关联   7.2.2 多对多关联   7.2.3 把列添加到联结表   7.2.4 映射map   7.3 多态关联   7.3.1 多态的多对一...

    Hibernate中文API大全

    (A mapping like this allows you to map extra columns of a many-to-many association table to the composite element class.) 接下来的的例子是从Order到Item的一个多对多的关联关系, 关联属性是 purchaseDate, ...

    java面试题

    答:Servlet与CGI的区别在于Servlet处于服务器进程中,它通过多线程方式允许其service方法,一个实例可以服务于多个请求,并且其实例一般不会被销毁,而CGI对每个请求都产生新的进程,服务完后就销毁,所以效率上...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    随着博客人数的增加, Blog 作为一种新的生活方式、新的工作方式、新的学习方式已经被越来越多的人所接受,并且在改变传统的网络和社会结构:网络信息不再是虚假不可验证的,交流和沟通更有明确的选择和方向性,单一...

    java源码包4

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    成百上千个Java 源码DEMO 4(1-4是独立压缩包)

    设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

    成百上千个Java 源码DEMO 3(1-4是独立压缩包)

    设定字符串为“张三,你好,我是李四” 产生张三的密钥对(keyPairZhang) 张三生成公钥(publicKeyZhang)并发送给李四,这里发送的是公钥的数组字节 通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后...

    JAVA上百实例源码以及开源项目

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包---java 源码 大量 实例

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包2

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    java源码包3

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

Global site tag (gtag.js) - Google Analytics