Spring-data-jpa, неверный SQL-запрос Hibernate возвращает NULL вместо Exception - PullRequest
0 голосов
/ 28 марта 2012

У меня есть проект Spring 3.1, использующий Spring-data-jpa для персистентности, Hibernate в качестве механизма персистентности и Postgresql 9.1 в качестве системы баз данных.
Я создал объект домена с комментариями jpa (Passport) и соответствующий repository, расширяющий JpaRepository для основных функций CRUD.
В целях тестирования я создал простой тестовый класс JUnit (см. Ниже) для проверки загрузки объекта Passport из базы данных.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:META-INF/applicationContext.xml")
@TransactionConfiguration
@Transactional
public class PassportRepositoryTest {

    @Resource
    protected PassportRepository repository;

    @Test
    public void testFindById() {
        Passport passport = repository.findOne(1L);
        assertNotNull("did not find expected entity", passport);
    }
}

Когда я запускаю тест, он не проходит, потому что null возвращается из findOne(1L), хотя в базе данных есть объект паспорта с этим основным идентификатором. Я проверил выходной журнал:

15:38:56.101 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Found thread-bound EntityManager [org.hibernate.ejb.EntityManagerImpl@11cf3710] for JPA transaction
15:38:56.101 [main] DEBUG o.s.orm.jpa.JpaTransactionManager - Participating in existing transaction
15:38:56.170 [main] DEBUG org.hibernate.loader.Loader - Loading entity: [com.gmi.lab.browser.server.domain.germplasm.Passport#1]
15:38:56.319 [main] DEBUG org.hibernate.SQL - select passport0_.div_passport_id as div1_2_3_, passport0_.accename as accename2_3_, passport0_.accenumb as accenumb2_3_, passport0_.div_accession_collecting_id as div7_2_3_, passport0_.comments as comments2_3_, passport0_.sampstat as sampstat2_3_, passport0_.source as source2_3_, passport0_.div_taxonomy_id as div8_2_3_, accessionc1_.div_accession_collecting_id as div1_3_0_, accessionc1_.collCode as collCode3_0_, accessionc1_.collDate as collDate3_0_, accessionc1_.collNumb as collNumb3_0_, accessionc1_.collSrc as collSrc3_0_, accessionc1_.collector as collector3_0_, accessionc1_.div_locality_id as div7_3_0_, locality2_.id as id0_1_, locality2_.city as city0_1_, locality2_.country as country0_1_, locality2_.elevation as elevation0_1_, locality2_.latitude as latitude0_1_, locality2_.loAccession as loAccess6_0_1_, locality2_.localityName as locality7_0_1_, locality2_.longitude as longitude0_1_, locality2_.origcty as origcty0_1_, locality2_.stateProvince as statePr10_0_1_, taxonomy3_.div_taxonomy_id as div1_1_2_, taxonomy3_.commonName as commonName1_2_, taxonomy3_.genus as genus1_2_, taxonomy3_.population as population1_2_, taxonomy3_.race as race1_2_, taxonomy3_.species as species1_2_, taxonomy3_.subspecies as subspecies1_2_, taxonomy3_.subtaxa as subtaxa1_2_, taxonomy3_.termAccession as termAcce9_1_2_ from Passport passport0_ left outer join AccessionCollection accessionc1_ on passport0_.div_accession_collecting_id=accessionc1_.div_accession_collecting_id left outer join Locality locality2_ on accessionc1_.div_locality_id=locality2_.id left outer join Taxonomy taxonomy3_ on passport0_.div_taxonomy_id=taxonomy3_.div_taxonomy_id where passport0_.div_passport_id=?
15:38:56.769 [main] DEBUG o.h.e.i.StatefulPersistenceContext - Initializing non-lazy collections
15:38:56.770 [main] DEBUG org.hibernate.loader.Loader - Done entity load

Когда я протестировал SQL-запрос для получения паспорта, я понял, что имя таблицы в базах данных не соответствует имени класса (в основном я забыл указать аннотацию @Table в классе Passport).

Вопрос : Почему Hibernate / spring-data-jpa не выдает исключение, когда SQL-запрос завершается неудачей, вместо того, чтобы возвращать null?

Update : Я забыл указать базу данных в моем подключении к БД. Как только я это исправил, я также получил исключения, когда оператор SQL был неверным.

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