一、代码使用
-
-
User user =
new
User();
-
UserMore more =
new
UserMore();
-
-
user.setMore(more);
-
more.setUser(user);
-
-
session.save(user);
二、具体配置
-
public
class
User
-
{
-
@OneToOne
(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional =
false
)
-
@PrimaryKeyJoinColumn
-
private
UserMore more;
-
-
-
}
-
public
class
UserMore
-
{
-
@Id
-
@GeneratedValue
(generator =
"pkGenerator"
)
-
@GenericGenerator
(
-
name =
"pkGenerator"
,
-
strategy =
"foreign"
,
-
parameters =
@Parameter
(name =
"property"
, value =
"user"
)
-
)
-
private
String id;
-
-
@OneToOne
(fetch = FetchType.LAZY)
-
@PrimaryKeyJoinColumn
-
private
User user;
-
-
-
}
三、具体说明
1.@PrimaryKeyJoinColumn
告诉hibernate使用主键作为关联字段 大体相当于@JoinColumn(name="id")
可能是由于官方文档写得不清楚 发现有人以为这个注解是用来指定另一端的主键生成方式
发现没达到目的后 就认为这个JPA的一个BUG
这个理解的错误的 其实JPA本身根本就不支持共享主键的"主键"生成方式
需要手动来同步主键 好在hibernate提供了一个扩展注解
2.@GenericGenerator(
name = "pkGenerator",
strategy = "foreign",
parameters = @Parameter(name = "property", value = "user")
)
这段注解的意思是 使用当前对象中user属性的主键来作为本对象的主键(有点绕口啊 理解万岁吧...)
3.@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, optional = false)
optional很重要 指定关联属性不能为空
如果想要实现延迟加载就一定要将这个属性设置为false
这是因为JPA需要知道对应的数据是否存在后 才能决定是创建一个"延迟代理"还是"null引用"
所以就不得不发起一条SQL请求来验证
转自:http://exceedsun21320070508164500.iteye.com/blog/370806
分享到:
相关推荐
在一对一的关联关系中,如果两个实体共享同一个主键,那么这种关联被称为共享主键的一对一关联。这意味着这两个实体的表在数据库中通过主键进行连接,一个实体的主键同时也作为另一个实体的外键。 在Hibernate中,...
主键关联是通过让两个实体的主键字段共享同一个值来建立一对一的关系。在Hibernate中,这通常通过在映射文件或注解中设置`@OneToOne`和`@PrimaryKeyJoinColumn`实现。 2. 实现方式: - XML配置:在实体类的映射...
在Java的持久化框架Hibernate中,一对一(OneToOne)关系是一种常见的对象关系映射(ORM)配置,用于表示两个实体类之间的一种唯一关联。在这个场景中,“hibernate使用主键关联的一对一关系”指的是通过共享主键来...
另一种方式是让双方实体共享同一个主键,这需要在双方的ID字段上都使用`@Id`和`@OneToOne`注解,并指定`@PrimaryKeyJoinColumn`。 **四、级联操作** `CascadeType.ALL`表示所有操作(包括保存、更新、删除等)...
需要注意的是,虽然一对一主键关联映射可以通过共享主键实现,但这也意味着如果一方被删除,另一方也会被级联删除,除非显式配置了`cascade`属性。此外,对于双向关联,需要在双方都定义`@OneToOne`注解,并通过`...
在Hibernate中,一对一的关联可以通过共享主键来实现,即两个表共用一个主键字段。 1. **注解配置**: Hibernate使用注解来声明实体类和它们之间的关系。对于一对一的主键关联,我们需要在两个实体类中都添加`@...
这里的`name`属性指定了关联的属性名,`class`是关联实体的全限定类名,`constrained`属性用于标识是外键约束关联还是共享主键关联。 ### 3. 注解映射 在使用注解的场景下,我们可以使用`@OneToOne`来定义一对一...
2. `@PrimaryKeyJoinColumn`:当两个实体共享主键时,使用此注解来指定关联的列。 以下是一个简单的双向一对一主键关联映射的示例: ```java @Entity public class User { @Id @GeneratedValue(strategy = ...
这种关联可以是共享主键(mappedBy)或者拥有独立主键。共享主键意味着两个实体共用同一个主键,而独立主键则意味着每个实体都有自己的主键。 二、配置与实现 1. 共享主键(Primary Key Join Column) 在这种情况下...
这种关联类型是数据库设计中的常见模式,它允许两个实体类之间通过共享相同的主键来建立关联。在Java应用中,利用Hibernate进行持久化操作时,正确配置这种关联可以帮助我们更有效地管理和检索数据。 首先,让我们...
1. **共享主键关联**: 这种方式下,两个实体共用同一个主键。例如,我们可以创建两个实体类:`Person` 和 `Passport`,`Person` 的ID也是 `Passport` 的ID。在`Person`类中,我们可以通过注解`@OneToOne`和`@...
这种关联意味着两个实体类共享相同的主键,即一个实体类的一个实例对应另一个实体类的唯一实例。 首先,我们要明确一对一主键关联映射的基本概念。在这种映射中,两个表(或实体类)通过主键进行关联,通常其中一个...
基于主键的关联意味着两个实体类的主键是相同的,即它们共享同一列作为主键。在上面的例子中,`Profile`类的`person`属性使用`@PrimaryKeyJoinColumn`注解,表示`Profile`的主键与`Person`的主键相同,形成了一对一...
这是最常用的一对一映射方式,通过共享主键来实现两个实体之间的关联。这种方式下,一个实体的主键同时也是另一个实体的外键。以下是一个示例: 1. 在实体类A中,声明对实体B的引用,并使用`@OneToOne`注解: ```...
本文将深入探讨Hibernate中实体映射的一对一关联关系的两种实现方式:共享主键方式和唯一外键方式。 首先,我们要理解什么是实体映射。在Hibernate中,实体映射是将Java类与数据库表之间的关系进行描述,使得我们...
唯一外键是指在一对一关联中,一方的主键同时也作为另一方的外键,确保两个实体共享同一个ID。这可以通过在没有`@JoinColumn`的情况下让两个实体共享相同的主键生成策略来实现。例如,使用`GenerationType.IDENTITY`...
在给出的部分内容中,我们可以看到一个具体的示例,展示了如何在Hibernate中配置一对一的主键关联: ```xml <!-- person的id同时也是idCard的id --> <param name="property">idCard <!--one-to-one标签...
在一对一(One-to-One)主键关联关系中,两个实体类之间存在唯一对应的关系,通常一个实体对应另一个实体的一个实例,这种关系可以通过共享主键来实现。 在Hibernate中,一对一的主键关联关系可以通过以下几种方式...
这里,`mappedBy`属性指定了关联的另一方,而`@PrimaryKeyJoinColumn`表明两个实体共享相同的主键。 ### 3. 插入和更新策略 在一对一关系中,插入和更新策略需要考虑。例如,你可以选择先保存父实体,然后保存子...