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

2024-01-12

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

@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 来说是否正常。我想既然这是一个“持久”操作,我只会看到一条插入语句;不确定选择的目的。

映射不正确吗?


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

User u = new User();
u.setUserStatusType( session.load(UserStatusType.class, new Long(id));
session.persist(u);

The session.load()方法最初不会加载任何内容,它只是为对象创建一个代理并避免对数据库的命中。现在,如果您想在会话上下文中访问类中的成员(除了 id 字段之外),那么 Hibernate 将访问数据库。就我而言,我只需要引用对象的主键INSERT,所以我避免了数据库命中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Hibernate OneToOne映射在插入之前执行select语句;不知道为什么 的相关文章

随机推荐