У меня есть ItemList
класса, содержащего набор Items
отображенных так:Hibernate партии вставки в однонаправленные коллекции один-ко-многим
<class name="ItemList">
<id name="PID" column="PID">
<generator class="uuid" />
</id>
<version name="Version" />
<set cascaed="save-update" name="Items">
<key column="itemlist_id" />
<one-to-many class="Item" />
</set>
</class>
<class name="Item">
<id name="PID" column="PID">
<generator class="uuid" />
</id>
...
</class>
Это однонаправленная ассоциация. Мне нужно вставить 1000s из Items
в ItemList
. Использование спящего режима док на пакетных вставок, у меня есть что-то вроде этого:
ItemList itemList = ...
int i = 0;
for (Item item : someItems) {
// .. some processing..
itemList.getItems().add(item);
if (++i % 30 == 0) {
session.update(itemList);
session.flush();
session.clear();
}
}
Есть очевидно, что некоторые проблемы с. На каждом флажке вставлено 30 предметов. Затем обновляется версия ItemList. Затем все 30 элементов обновляются с помощью PID элемента списка.
- Как я могу избежать увеличения версии ItemList после каждой партии?
- Как я могу избежать 30 обновлений?
(1) Потому что все вставки - это только одна операция, и версия должна отражать это. (2) После того, как 30 элементов вставлены, запускаются 30 операторов UPDATE. Я пытаюсь их избежать. (3) Мой последний вопрос был неясным, но я думаю, что понял это. – takteek
(1) Я отредактировал ответ, чтобы он попытался объяснить, почему это невозможно. (2) Я удивлен этим ... У меня нет ответа на это, и я не понимаю, почему Hibernate не мог автоматически оптимизировать эту оптимизацию. (3) отлично. – yair
и (1) 'version' не должен отражать это, поскольку он предназначен для оптимистического контроля параллельности блокировки. Таким образом, это не обязательно отражает _transactions_. – yair