Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Help me, JPA developers / 7 сообщений из 7, страница 1 из 1
27.04.2012, 19:03:16
    #37775031
WickedPacman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me, JPA developers
Есть элементарная задача. Использую JPA 1.0. Есть ентити - MyEntity, которая содержит поля id, value1, value2, managedvalue1, managedvalue2. Все поля, кроме ID - имеют тип String.
Есть также запрос (приходит изначально от вебсервиса) - updateEnitities(List<MyEntity> entites). Для каждой интити нужно найти соответсвующее поле в базе - по value1 и value2 и изменить ее значения managedvalue1 и managedvalue2.
Вопрос: Как можно реализовать дао? Кучу апдейтов делать неохота, т.к. хибер почему то не делает Batch Update, а делает N реквестов в БД. CriteriaBuilder использовать нельзя, т.к. jpa 1.0. Стринги конкатенировать в длинный запрос (так мне советует мой лид) - тоже нехорошо + кеш оракла засорять неохота + там будет 3 цикла - на создание основного запроса, потом на вставку "?" и потом query.setParameter. Я бы предпочел выгрузить нужные ентити, проставить у них сеттеры и закомитить (в этом случае хибер сделает батч апдейт), но лид опять же говорит, что это плохо, т.к. идет 2 обращение в БД и данные вытягивать нехорошо - мы их хотим апдейтить и это лишняя операция.
Есть ли другие альтернативы?
...
Рейтинг: 0 / 0
27.04.2012, 19:17:14
    #37775035
WickedPacman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me, JPA developers
Так, я тут немного напутал и скрестил 2 задачи. Для начала нужно понять, как сделать селект для такого запроса на HSQL, чтобы за один запрос вытащить все энтити. А потом, желательно, в 1-2 реквеста к БД сделать балковый апдейт
...
Рейтинг: 0 / 0
27.04.2012, 22:00:24
    #37775140
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me, JPA developers
WickedPacmanчтобы за один запрос вытащить все энтитизачем их вытаскивать-то?
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Query q = em.createQuery("update MyEntity set mv1 = :mv1, mv2 = :mv2 where v1 = :v1 and v2 = :v2");
int i = 0;
for (MyEntity me : entities) {
  q.setParameter("v1", me.v1);
  q.setParameter("v2", me.v2);
  q.setParameter("mv1", me.mv1);
  q.setParameter("mv2", me.mv2);
  q.executeUpdate();
  if (++i % 100 == 0) {
    i = 0;
    em.flush();
    em.clear();
  }
}



а в хибернейте StatelessSession есть
...
Рейтинг: 0 / 0
27.04.2012, 23:16:45
    #37775214
WickedPacman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me, JPA developers
grasoff.net,

да это решение то очевидно и так. Проблема у него такая, что не охота мне entities.size() раз обращаться к БД. Ваше решение будет медленно работать.
...
Рейтинг: 0 / 0
27.04.2012, 23:20:46
    #37775219
WickedPacman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me, JPA developers
Так, похоже я забыл про flushMode. Протестирую перфоманс и отпишусь
...
Рейтинг: 0 / 0
27.04.2012, 23:32:27
    #37775230
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me, JPA developers
ещё есть batch_size например
...
Рейтинг: 0 / 0
27.04.2012, 23:44:38
    #37775240
WickedPacman
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Help me, JPA developers
grasoff.net,
Да, но эта проперти, на сколько я помню, настраивается на весь persistence.xml, а мне нужно только в одном месте заюзать.
И я так понимаю, flush != batch. Ведь так? в чем отличия?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Help me, JPA developers / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]