Hibernate4一对一关系映射(共享主键方式)
2016-03-21 18:12
239 查看
示例:一个人(person) 住一个地址(address),一个地址有一个人。
Java代码
public class Person {
private Integer id;
private String name;
private Address address;
//getter and setter
}
Java代码
public class Address {
private Integer id;
private String detail;
private Person person;
//getter and setter
}
用XML映射
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>
Xml代码
<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映射
Java代码
@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
}
Java代码
@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定义了一对一关联
测试代码
Java代码
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
Sql代码
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
(?, ?)
Java代码
public class Person {
private Integer id;
private String name;
private Address address;
//getter and setter
}
Java代码
public class Address {
private Integer id;
private String detail;
private Person person;
//getter and setter
}
用XML映射
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>
Xml代码
<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映射
Java代码
@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
}
Java代码
@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定义了一对一关联
测试代码
Java代码
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
Sql代码
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
(?, ?)
相关文章推荐
- Bzoj 4196: [Noi2015]软件包管理器 树链剖分
- 记录ConcurrentHashMap的锁分离技术
- 从尾到头打印链表
- xcode几个常用的快捷键
- 读《构建之法》第1.2.3章的思考与感悟
- JAVA学习总结4
- ubuntu 14.04 启用nfs连接开发板
- 一周讲座活动后的领悟
- 学习小结—2016.3.21(周一)18:11;于3.31晚宿舍续写
- Hibernate4组件映射
- 疯魔余承东:四年间打造令苹果、三星敬畏的华为手机
- webveiw的基本使用?
- iOS 基础之NSArray数组去重
- 51nod1009 数字1的数量
- iOS网络开发 - 浏览器
- Android UI 之使用java代码实现动态添加LinearLayout(一)
- HBase周边知识
- Mac下安装brew
- js的块级作用域问题
- Hibernate4继承映射