这是一个非常简单的测试,关于在数据库中持久保存一个临时的 Person 对象,然后验证该对象是否保存在 数据库与 transient 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));
}
我的 daoIntegration-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>
域类是:
@Entity
@Table(name="table_Person")
public class Person {
@Id
@TableGenerator(name = "seq_table", table = "GENERATOR_TABLE")
@GeneratedValue(strategy = GenerationType.TABLE, generator = "seq_table")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
private Long id;
private String personFirstName;
...
第一个断言通过,但第二个断言失败,我在某个地方犯了一个愚蠢的错误,但不知道在哪里!!!
最佳答案
第一个可能的问题
第二个断言失败只是因为它返回 Person
对象的不同实例。由于您没有(?)定义 equals()
/hashCode()
,因此 is()
匹配器失败。
实现它们(对于 Hibernate 这通常是一个好主意)。
第二个可能的问题
第一个断言通过,因为 Hibernate 从 seq_table 获取了 id,但尚未刷新实体本身。这意味着该实体位于一级缓存中,但尚未位于数据库中。因此,当您直接使用 JDBC 查询数据库时:
jdbcTemplate.queryForObject("select * from table_Person", Person.class);
未找到该记录。保存实体后调用 flush()
或使用 JPA 查询对象。 Hibernate 足够聪明,可以flush()
预先查询。
关于java - 一个简单的 Dao 集成测试不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8457039/