Выбор из вида в H2 не работает - PullRequest
0 голосов
/ 01 августа 2011

Я недавно заменил базу данных модульных тестов PostgreSql на базу данных H2 в памяти. Я не мог понять, почему пара тестов провалилась, с Postgre все работало нормально. Есть ок. 280+ юнит-тестов в этом приложении. Неудачные тесты dao выбираются из представления, и у сущности есть EmbeddedId, то есть столбцы этого представления. См. Ниже код (Примечание: я изменил имена, код и sql, чтобы скрыть настоящие имена при написании этого письма, но это был работающий юнит-тест с Postgre db)

<pre>

@Table(name = "item_view") // <- item_view is a database view
public class ItemV implements Serializable
{
    .....
    @EmbeddedId // <- entity has an embedded id
    private ItemVId id;  
    .....

@Embeddable
    public static class ItemVId implements Serializable //<- This is the embeddedId
    {
        @Column(name = "item_id", updatable=false, insertable=false)
        private Long ItemId; //<- col no.1 of view

        @Column(name = "item_type_id", updatable=false, insertable=false)
        private Integer ItemTypeId; //<- col no.2 of view
    .....       
ItemType is an enum

And the view is
CREATE OR REPLACE VIEW item_view AS 
        (        (        (         SELECT pt.id as item_id, cit.id as item_type_id
                                   FROM xyz pt, item_type cit
                                  WHERE pt.name::text = 'xyz'::text
                        UNION 
                                 SELECT z.id as item_id, cit.id as item_type_id
                                   FROM zzz z, item_type cit
                                  WHERE z.name::text = 'zzz'::text)
                ..............

and the dao method is

    public ItemView find(Long itemId, ItemType itemType)
    {
        String hql = " from ItemV iv where iv.id.itemId = :itemId  and iv.id.itemTypeId = :itemTypeId ");
        List<ItemView> result = (List<ItemView>)getEntityManager()
            .createQuery(hql)
            .setParameter("itemId", itemId)
            .setParameter("itemTypeId", itemType.getId())
            .setMaxResults(1)
            .getResultList();
        return result.isEmpty()
            ? null : result.get(0);
    }

Этот метод dao всегда возвращает пустые результаты, никогда не находя существующие строки в представлении ??? Я знаю, что эти строки существуют, потому что когда я выполняю getAll () на том же дао, я вижу результаты и вижу соответствующую строку для критериев.

Есть ли что-то особенное в выборе строк из представления в базе данных H2? Спасибо

1 Ответ

1 голос
/ 02 августа 2011

ОК исправлено, мне пришлось использовать меньшее значение для значения LOCK_TIMEOUT, так что теперь я могу подключиться к базе данных и увидеть значения.Устранена проблема выбора при просмотре.

Я должен сказать, что H2 действительно аккуратный и элегантный.Я рад, что переключил дб модульного теста на H2.

...