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

我在我的实体中配置了一个简单的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是否正常。 我想,因为这是一个“坚持”的操作,我只会看到一个插入语句; 不确定选择的目的。

映射不正确?


好的,我可以从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引用对象的主键,所以我避免了数据库命中。

链接地址: http://www.djcxy.com/p/63679.html

上一篇: Hibernate OneToOne mapping executes select statement before insert; not sure why

下一篇: hibernate mapping problem