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

时间:2011-03-06 02:51:06

标签: hibernate

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

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

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

UserStatusType只是一个只读查找表,因此当我保存用户时,该表中没有任何内容。

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语句;不确定选择的目的。

映射不正确吗?

1 个答案:

答案 0 :(得分:5)

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

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

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