Trying to persist to an oracle db using hibernate 4 and spring 3 without success. Tests pass but data not persisted.

StackOverflow https://stackoverflow.com/questions/12758769

Question

I am trying to implement a simple DAO using hibernate 4 and Spring 3.

When I try to save or delete a row in the db the transaction is not persisted. I have included some code to show how the saving in the db doesnt work:

I have a junit test which simply tries to save a StockEntityDTO in the db.

@RunWith(SpringJUnit4ClassRunner.class)
public class StocksDAOImplTest extends
    AbstractTransactionalJUnit4SpringContextTests {

@Autowired
protected StocksDAO stockDao;


@Test
public void shouldInsertIntoDatabase() {
    BigDecimal price = new BigDecimal(653.50);
    StockEntityDTO savedStock = new StockEntityDTO("GOOG", price, "google");
    stockDao.create(savedStock);
    StockEntityDTO retrievedStock = stockDao.getById(savedStock.getId());
    assertEquals(savedStock, retrievedStock);
}

The test passes but the expected row (1, "GOOG", 653.50, "google") is not persisted in the db.

The DAO looks like this:

@Transactional
public abstract class AbstractHibernateDAO<T extends Serializable> {

private Class<T> clazz;


@Resource(name = "sessionFactory")
private SessionFactory sessionFactory;


public void setClazz(final Class<T> clazzToSet) {
    this.clazz = clazzToSet;
}


public void create(final T entity) {
    Session session = this.getCurrentSession();
    session.save(entity);

}

Application Context:

<tx:annotation-driven transaction-manager="transactionManager" />

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
    <property name="username" value="gtp" />
    <property name="password" value="gtp" />
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.ubs.gtp.data.domain" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate4.SpringSessionContext
            </prop>
        </props>
    </property>
</bean>

Hope someone can help. As is probably evident from my code, I am very new to spring.

Was it helpful?

Solution

AbstractTransactionalJUnit4SpringContextTests rolls back after the test. Try setting a breakpoint at the last line and then inspecting the database. You can use the Rollback annotation if you don't want this default behaviour.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top