Создание шаблона гибернации SpringSource Tool Suite (STS) - PullRequest
1 голос
/ 19 января 2011

Я создал проект Hibernate, используя Spring Template Project. Были созданы два объекта домена, тест JUnit, app-context.xml и persistence-context.xml. Теперь я заметил эту строку

<jdbc:embedded-database id="dataSource"></jdbc:embedded-database>

и предположим, что происходит следующее

  1. Используется стандартная база данных HQSL
  2. Две созданные модели Order.java и Item.java будут автоматически созданы в таблицах памяти T_ORDER и T_ITEM, и они будут отображены в соответствии с аннотациями к объектам. Внутри автоматически созданных классов один из методов тестирования выглядит следующим образом:

    @Test
    @Transactional
    public void testSaveAndGet() throws Exception {
        Session session = sessionFactory.getCurrentSession();
        Order order = new Order();
        order.getItems().add(new Item());
        session.save(order);
        session.flush();
        // Otherwise the query returns the existing order
        // (and we didn't set the parent in the item)...
        session.clear();
        Order other = (Order) session.get(Order.class, order.getId());
        assertEquals(1, other.getItems().size());
        assertEquals(other, other.getItems().iterator().next().getOrder());
    }
    

Вопросы ...

  1. Правильно ли я считаю, что таблицы в памяти создаются на основе моделей домена (порядок / позиция) и отображаются на карте? Поэтому session.flush () синхронизирует объект с физическим (в таблице памяти) ....
  2. Эти таблицы автоматически отображаются, потому что если я сделаю следующее

    session.save(order);
    session.flush();
    session.clear();
    Order other = (Order) session
       .createQuery("from T_ORDER where ORDER_ID =: orderid")
       .setLong("orderid", order.getId())
       .uniqueResult();
    

я получаю исключение ...

org.hibernate.hql.ast.[B]QuerySyntaxException[/B]: \
T_ORDER is not mapped [from T_ORDER where ORDER_ID =: orderid]
............
............

если эти таблицы не отображаются автоматически, как в первую очередь работает очистка?

1 Ответ

1 голос
/ 19 января 2011

Создание таблиц является функцией Hibernate (и других провайдеров JPA).Это происходит при запуске приложения / теста.Это не имеет никакого отношения к любому запросу.Даже если вы только запускаете свой тест с запущенным и настроенным Hibernate, он может создавать таблицы.

Если Hibernate создает таблицы, один раз удалить старые и т. Д., Зависит от его конфигурации: свойство: hibernate.hbm2ddl.auto используется то, что делает hibernate, если он запускается.Например, значение update добавит несуществующие таблицы и столбцы.

Дополнительные сведения можно найти в документации .

Ваше исключение Когда вы используете Hibernate и пишете операторы запросов hibernate, тогда вы должны использовать HQL, а не SQL.- Основное отличие состоит в том, что HQL основан на классах, а не на таблицах.Так что в вашем случае вы не должны использовать T_ORDER, но Order (то же самое для идентификатора, вам нужно использовать имя свойства / поля, но не имя столбца).

...