Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个简单的Dao集成测试不起作用_Java_Hibernate_Spring_Tdd_Hibernate Generic Dao - Fatal编程技术网

Java 一个简单的Dao集成测试不起作用

Java 一个简单的Dao集成测试不起作用,java,hibernate,spring,tdd,hibernate-generic-dao,Java,Hibernate,Spring,Tdd,Hibernate Generic Dao,这是一个非常简单的测试,用于在数据库中持久化一个临时Person对象,然后验证该对象是否保存在数据库中 数据库与临时人员对象相同。 考试开始了 @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("/daoIntegration-test.xml") @Transactional public class HibernatePersonDaoIntegrationTest { @Autowired priva

这是一个非常简单的测试,用于在数据库中持久化一个临时Person对象,然后验证该对象是否保存在数据库中 数据库与临时人员对象相同。 考试开始了

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/daoIntegration-test.xml")
@Transactional
public class HibernatePersonDaoIntegrationTest {
    @Autowired
    private PersonDao PersonDao;
    @Autowired
    private SessionFactory sessionFactory;
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Test
    public void shouldSavePerson() {
        //Given
        Person person = new Person();

        //When
        PersonDao.savePerson(person);

        //Then ----THIS ASSERTION PASSES!!!
        assertThat(person.getId(), notNullValue());
        //And ----THIS ONE FAILS!!!
        Person persistedPerson = jdbcTemplate.queryForObject("select * from table_Person", Person.class);
        assertThat(persistedPerson, is(person));
    }
My-test.xml

<jdbc:embedded-database id="dataSource" type="HSQL"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="packagesToScan" value="com.domain"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
        </props>
    </property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource"/>
</bean> 
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"/>
</bean>

第一个断言通过了,但第二个断言失败了,我在某处犯了一个愚蠢的错误,但不知道在哪里

您正在执行一个
SELECT*
查询,该查询仅在数据库中有一行时返回一个对象

如果查询没有只返回一行,或者没有只返回一个对象,则会抛出一个
IncorrectResultSizeDataAccessException

您确定没有引发异常吗


Person类是否实现了equals和hashCode?如果is()方法依赖于这些,那么它不会比您的实现所允许的更好。

您正在执行一个
SELECT*
查询,该查询仅在数据库中有一行时返回一个对象

如果查询没有只返回一行,或者没有只返回一个对象,则会抛出一个
IncorrectResultSizeDataAccessException

您确定没有引发异常吗

Person类是否实现了equals和hashCode?如果is()方法依赖于这些,那么它不会比您的实现所允许的更好。

第一个可能的问题 第二个断言失败仅仅是因为它返回了
Person
对象的不同实例。由于没有(?)定义
equals()
/
hashCode()
,因此
is()
匹配器失败

实现它们(使用Hibernate通常是一个好主意)

第二个可能的问题 第一个断言通过,因为Hibernate从
seq_table
获取了id,但尚未刷新实体本身。这意味着实体在一级缓存中,但尚未在数据库中。因此,当您直接使用JDBC查询数据库时:

jdbcTemplate.queryForObject("select * from table_Person", Person.class);
找不到该记录。保存实体后调用
flush()
,或使用JPA查询对象。Hibernate足够聪明,可以在查询之前
flush()

第一个可能的问题 第二个断言失败仅仅是因为它返回了
Person
对象的不同实例。由于没有(?)定义
equals()
/
hashCode()
,因此
is()
匹配器失败

实现它们(使用Hibernate通常是一个好主意)

第二个可能的问题 第一个断言通过,因为Hibernate从
seq_table
获取了id,但尚未刷新实体本身。这意味着实体在一级缓存中,但尚未在数据库中。因此,当您直接使用JDBC查询数据库时:

jdbcTemplate.queryForObject("select * from table_Person", Person.class);

找不到该记录。保存实体后调用
flush()
,或使用JPA查询对象。Hibernate足够聪明,可以在查询之前
flush()

person和persistedPerson是两个不同的实例,因此它们并不相等。它们可能是等价的。e、 g Person.ID=persistedPerson.ID等。您可以重写Person类的equals运算符,但鉴于您尚未重写equals运算符,因此检查一些Person属性可能是最好的。我重写了equals和hashcode,问题在于该实体未保存在数据库中,刷新它解决了@Tomaszperson和persistedPerson所建议的问题,这是两个不同的实例,因此它们并不相等。它们可能是等价的。e、 g Person.ID=persistedPerson.ID等。您可以重写Person类的equals运算符,但鉴于您尚未重写equals运算符,因此检查一些Person属性可能是最好的。我重写了equals和hashcode,问题在于该实体未保存在数据库中,冲洗它解决了@Tomasz建议的问题