JPA 通过 id 创建对象
JPA create object by id
我有以下 JPA 实体:
@Entity
@Table(name = "sessions")
public class Session extends BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
...
}
为了将新的 Session
对象插入数据库,我需要执行以下步骤:
- Select
user
来自 db
- 创建新的
Session
对象,将 user
设置为此 session
对象,然后调用 sessionRepository.save(session)
如果我知道 user_id
是否可以避免第 1 步?我不想在可能的情况下对我的数据库进行冗余 select。
使用 EntityManager.getReference()
而不是 EntityManager.find()
(在 Spring-data-jpa crud 存储库中,此操作被命名为 getOne()
)。
这 returns 一个惰性的、未初始化的用户代理,不执行任何 SQL 查询。当然,如果你试图为一个不存在的用户插入一个新的Session,你最好在数据库中有一个外键约束,以确保插入失败。
有一个 API 可以用于此目的。
如果你使用JPA,你可以使用entityManager.getReference()
加载用户。这不会调用数据库,除非您对生成的实例执行某些操作。
Hibernate 的等效项是 session.load()
,其行为方式相同。
我有以下 JPA 实体:
@Entity
@Table(name = "sessions")
public class Session extends BaseEntity implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne
@JoinColumn(name = "user_id")
private User user;
...
}
为了将新的 Session
对象插入数据库,我需要执行以下步骤:
- Select
user
来自 db - 创建新的
Session
对象,将user
设置为此session
对象,然后调用sessionRepository.save(session)
如果我知道 user_id
是否可以避免第 1 步?我不想在可能的情况下对我的数据库进行冗余 select。
使用 EntityManager.getReference()
而不是 EntityManager.find()
(在 Spring-data-jpa crud 存储库中,此操作被命名为 getOne()
)。
这 returns 一个惰性的、未初始化的用户代理,不执行任何 SQL 查询。当然,如果你试图为一个不存在的用户插入一个新的Session,你最好在数据库中有一个外键约束,以确保插入失败。
有一个 API 可以用于此目的。
如果你使用JPA,你可以使用entityManager.getReference()
加载用户。这不会调用数据库,除非您对生成的实例执行某些操作。
Hibernate 的等效项是 session.load()
,其行为方式相同。