0

我有一个 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),尽管数据库中有一个具有该主 ID 的护照对象。我检查了输出日志:

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)。

问题:为什么当 SQL 查询失败而不是返回时,Hibernate/spring-data-jpa 不抛出异常null

更新:我忘了在我的数据库连接中指定数据库。一旦我解决了这个问题,当 SQL 语句错误时,我也会得到异常。

4

0 回答 0