Hibernate OneToOne 映射在插入前执行 select 语句;不知道为什么

标签 hibernate

我在我的实体中配置了一个简单的 OneToOne 映射,但是当我持久化对象时,我看到 Hibernate 在插入之前执行了一个“选择”语句,我不知道为什么。

@Entity 
@Table( name = "USER" )
public class NewUser {

   @OneToOne
   @JoinColumn(name="user_status_type_id", nullable=false)
   private UserStatusType userStatusType;

UserStatusType 只是一个只读查找表,所以当我保存 User 时,该表中没有任何内容。
User u = new User();
u.setUserStatusType( new UserStatusType(101));
session.persis(u);

但是当我持久化 User 对象时,Hibernate 的输出如下:
Hibernate: select userstatus_.user_status_type_id, userstatus_.user_status_name as user2_3_ from USER_STATUS_TYPE userstatus_ where userstatus_.user_status_type_id=?
Hibernate: insert into USER (created, first_name, last_name, password, user_name, user_status_type_id) values (?, ?, ?, ?, ?, ?)

我不知道这对于 Hibernate 是否正常。我想因为这是一个“持久化”操作,所以我只会看到一个 Insert 语句;不确定 Select 的目的。

映射不正确?

最佳答案

好的,我能够从 Hibernate 论坛中得到答案。防止SELECT之前 INSERT , 如果您确定引用的行存在于数据库中,则使用 Session.load()EntityManager.getReference() .

User u = new User();
u.setUserStatusType( session.load(UserStatusType.class, new Long(id));
session.persist(u);
session.load()方法最初不加载任何东西,它只是为对象创建一个代理并避免对数据库的命中。现在,如果您想从 session 上下文中的类访问成员(除了 id 字段),那么 Hibernate 将转到数据库。在我的情况下,我只需要来自 INSERT 的引用对象的主键,所以我避免了数据库命中。

关于Hibernate OneToOne 映射在插入前执行 select 语句;不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5208334/

相关文章:

hibernate - 从Hibernate Grails中选择数据库

java - Hibernate 和 Java 泛型 - 无法使用 MappedSuperClass 创建 session 工厂

java - hibernate 异常 : Found two representations of same collection

java - 为什么我在结果集中间得到 Javassist 对象?

java - 如何处理 JPA @OneToOne 映射中的 "orphaned"行

hibernate - Tomcat 启动失败

java - JPA, hibernate 。如何从@TableGenerator 获取下一个值

hibernate - 我有 FetchType.LAZY 和 hibernate 对象仍然加载

oracle - Grails域:找不到ID获取

java - 如何覆盖 FetchType.EAGER 以在运行时变得懒惰