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 对象插入数据库,我需要执行以下步骤:

  1. Select user 来自 db
  2. 创建新的 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(),其行为方式相同。