Цикл сохранения данных в Hibernate без добавления всех элементов - PullRequest
0 голосов
/ 25 апреля 2018

Попытка использовать цикл for для сохранения / фиксации данных с использованием hibernate 4.3.11. Окончание с SQLite Dialect com.enigmabridge:hibernate4-sqlite-dialect

Когда я запускаю этот код и проверяю данные Sqlite, я вижу, что в нем сохранен только 1 элемент (кажется, что он фиксируется только один раз) и что один элемент является последним (из 5 сгенерированных элементов), которые я вижу в базе данных.

configureSessionFactory();
Session session = null;
Transaction tx=null;
try {
    session = sessionFactory.openSession();
    SyndEntry entry = null;
    URL feedUrl = new URL(rssUrl);
    SyndFeedInput input = new SyndFeedInput();
    SyndFeed feed = input.build(new XmlReader(feedUrl));
    tx = session.beginTransaction();
    BroadcastItem item = new BroadcastItem();
    for (int i = 0 ; i < 5 ; i++) {
         entry = (SyndEntry) feed.getEntries().get(i);
         item.setMessage(entry.getTitle());
         item.setLinkUrl(entry.getLink());
         session.save(item);
    }
    tx.commit();
} catch (Exception ex) {
  ex.printStackTrace();
  // Rolling back the changes to make the data consistent in case of any failure in between multiple database write operations.
   tx.rollback();
} finally{
  if(session != null) {
      session.close();
  }
}

Но когда я перемещаю tx = session.beginTransaction(); внутри цикла for, я получаю

вложенные транзакции не поддерживаются

  1. Как мне выполнить то, что я хочу (цикл 5 раз, добавляя элемент данных каждый раз в базу данных)?
  2. Почему коммит запускается только один раз?

1 Ответ

0 голосов
/ 25 апреля 2018

Когда вы пишете

    BroadcastItem item = new BroadcastItem();

    for (int i = 0 ; i < 5 ; i++) {
        entry = (SyndEntry) feed.getEntries().get(i);

        item.setMessage(entry.getTitle());
        item.setLinkUrl(entry.getLink());

        session.save(item);
    }

Вы сохраняете (создаете) свой item в первый раз, а в другое время цикла вы сохраняете (обновляете) свой item.

Вам просто нужно поместить ваше творение BroadcastItem в цикл следующим образом:

    for (int i = 0 ; i < 5 ; i++) {
        entry = (SyndEntry) feed.getEntries().get(i);
        BroadcastItem item = new BroadcastItem();

        item.setMessage(entry.getTitle());
        item.setLinkUrl(entry.getLink());

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