我在我的实体中配置了一个简单的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语句;不确定选择的目的。
映射不正确吗?
答案 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引用对象的主键,所以我避免了数据库命中。