Отображение Hibernate OneToOne выполняет оператор выбора перед вставкой; не уверен почему - PullRequest
4 голосов
/ 06 марта 2011

Я настроил простое сопоставление OneToOne в своей сущности, но когда я сохраняю объект, я вижу оператор "Select", выполняемый Hibernate незадолго до вставки, и я не знаю, почему.

@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. Я подумал, что поскольку это была «постоянная» операция, я бы увидел только оператор вставки; не уверен в цели выбора.

Неверно ли сопоставление?

1 Ответ

5 голосов
/ 12 марта 2011

ОК, я смог получить ответ на форумах Hibernate. Чтобы предотвратить SELECT перед INSERT, если вы уверены, что указанная строка существует в базе данных, используйте 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, поэтому я избежал попадания в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...