Принудительная вставка в спящий режим без выбранных операторов - PullRequest
5 голосов
/ 28 сентября 2011

Я пытаюсь вставить новую запись в таблицу, которая, как я знаю, является уникальной.Я пытался вызвать save () для объекта, но он делает кучу инструкций SELECT перед выполнением любых INSERT, что я не хочу делать, потому что я знаю, что объект уже уникален.

Я открываюновый сеанс для каждой транзакции, который, как я вижу, является проблемой, но это ограничение моего домена.Есть ли способ заставить Hibernate не делать никаких SELECT до того, как он вставит?

Ответы [ 3 ]

8 голосов
/ 29 сентября 2011

Вы можете использовать метод persist () вместо save ().

https://forum.hibernate.org/viewtopic.php?f=1&t=1011405

Однако, в отличие от save (), функция persist () не гарантирует, что значение идентификатора будет немедленно установлено в постоянном экземпляре.

https://forum.hibernate.org/viewtopic.php?t=951275

2 голосов
/ 29 сентября 2011

Hibernate пытается определить, является ли объект временным или нет, поэтому выполняет SELECT до INSERT. Возможно, вы сможете адаптировать этот ответ из Отображение Hibernate OneToOne выполняет оператор выбора перед вставкой; не уверен, почему , чтобы избежать SELECT.

Или я помню сообщение на форуме о переопределении столбца version, который hibernate использует в переходной проверке (и для оптимистической блокировки). Я отредактирую этот ответ, когда найду его.

1 голос
/ 29 сентября 2011

Hibernate не выдает выбор, чтобы увидеть, является ли объект уникальным для save().На самом деле, Hibernate даже не выдает вставку, когда вы звоните save().Это происходит, когда вы flush() или совершаете транзакцию.Вам нужно будет точно узнать, для чего предназначены селекторы и что их инициирует.Чтобы сузить его, вы можете написать быстрый тест, например

Session session = openSession();
Transaction tx = session.beginTransaction();
session.save(myObject);
tx.commit();

, и посмотреть, какие выражения выдает.

...