-
-
Save twasink/2881461 to your computer and use it in GitHub Desktop.
An example of using Spring and Hibernate together to automatically create a HSQLDB in-memory database for testing hibernate mappings. |
package net.twasink.hsqldbtest; | |
import static javax.persistence.GenerationType.AUTO; | |
import javax.persistence.Column; | |
import javax.persistence.Entity; | |
import javax.persistence.GeneratedValue; | |
import javax.persistence.Id; | |
import javax.persistence.Table; | |
@Entity | |
@Table | |
public class Foo { | |
@Id | |
@GeneratedValue(strategy = AUTO) | |
@Column | |
private long id; | |
@Column(length = 50, nullable = false, unique = true) | |
private String name; | |
@Column(length = 200, nullable = true) | |
private String description; | |
Foo() { | |
// for hibernate. | |
} | |
public Foo(String name) { | |
this.name = name; | |
} | |
public long getId() { | |
return id; | |
} | |
public String getName() { | |
return name; | |
} | |
public String getDescription() { | |
return description; | |
} | |
public void setDescription(String description) { | |
this.description = description; | |
} | |
} |
package net.twasink.hsqldbtest; | |
import static org.junit.Assert.assertEquals; | |
import static org.junit.Assert.assertNotNull; | |
import static org.junit.Assert.assertTrue; | |
import java.util.List; | |
import org.hibernate.SessionFactory; | |
import org.hibernate.classic.Session; | |
import org.junit.Before; | |
import org.junit.Test; | |
import org.junit.runner.RunWith; | |
import org.springframework.beans.factory.annotation.Autowired; | |
import org.springframework.test.context.ContextConfiguration; | |
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; | |
import org.springframework.transaction.annotation.Transactional; | |
@RunWith(SpringJUnit4ClassRunner.class) | |
@ContextConfiguration("/testContext.xml") | |
@Transactional | |
public class FooTest { | |
@Autowired | |
private SessionFactory sessionFactory; | |
private Session currentSession; | |
@Before | |
public void openSession() { | |
currentSession = sessionFactory.getCurrentSession(); | |
} | |
@Test | |
public void shouldHaveASessionFactory() { | |
assertNotNull(sessionFactory); | |
} | |
@Test | |
public void shouldHaveNoObjectsAtStart() { | |
List<?> results = currentSession.createQuery("from Foo").list(); | |
assertTrue(results.isEmpty()); | |
} | |
@Test | |
public void shouldBeAbleToPersistAnObject() { | |
assertEquals(0, currentSession.createQuery("from Foo").list().size()); | |
Foo jobUser = new Foo("Bar"); | |
currentSession.persist(jobUser); | |
currentSession.flush(); | |
assertEquals(1, currentSession.createQuery("from Foo").list().size()); | |
} | |
@Test | |
public void shouldBeABleToQueryForObjects() { | |
shouldBeAbleToPersistAnObject(); | |
assertEquals(1, currentSession.createQuery("from Foo where name = 'Bar'").list().size()); | |
assertEquals(0, currentSession.createQuery("from Foo where name = 'Baz'").list().size()); | |
} | |
} |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | |
<modelVersion>4.0.0</modelVersion> | |
<groupId>net.twasink</groupId> | |
<artifactId>hsqldb-hibernatetest</artifactId> | |
<version>0.0.1-SNAPSHOT</version> | |
<dependencies> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-orm</artifactId> | |
<version>3.0.6.RELEASE</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-tx</artifactId> | |
<version>3.0.6.RELEASE</version> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-aspects</artifactId> | |
<version>3.0.6.RELEASE</version> | |
</dependency> | |
<dependency> | |
<groupId>org.hibernate</groupId> | |
<artifactId>hibernate-core</artifactId> | |
<version>3.6.9.Final</version> | |
</dependency> | |
<dependency> | |
<groupId>org.hibernate</groupId> | |
<artifactId>hibernate-annotations</artifactId> | |
<version>3.5.6-Final</version> | |
</dependency> | |
<dependency> | |
<groupId>org.aspectj</groupId> | |
<artifactId>aspectjrt</artifactId> | |
<version>1.5.4</version> | |
<scope>runtime</scope> | |
</dependency> | |
<dependency> | |
<groupId>org.javassist</groupId> | |
<artifactId>javassist</artifactId> | |
<version>3.16.1-GA</version> | |
<scope>runtime</scope> | |
</dependency> | |
<!-- without a slf4j bridge, you get no logging if anything goes wrong. --> | |
<dependency> | |
<groupId>org.slf4j</groupId> | |
<artifactId>slf4j-log4j12</artifactId> | |
<version>1.6.4</version> | |
<scope>runtime</scope> | |
</dependency> | |
<dependency> | |
<groupId>junit</groupId> | |
<artifactId>junit</artifactId> | |
<version>4.10</version> | |
<scope>test</scope> | |
</dependency> | |
<dependency> | |
<groupId>org.springframework</groupId> | |
<artifactId>spring-test</artifactId> | |
<version>3.0.6.RELEASE</version> | |
<scope>test</scope> | |
</dependency> | |
<dependency> <!-- needed to get AOPs around the test cases --> | |
<groupId>cglib</groupId> | |
<artifactId>cglib-nodep</artifactId> | |
<version>2.2.2</version> | |
<scope>test</scope> | |
</dependency> | |
<dependency> | |
<groupId>org.hsqldb</groupId> | |
<artifactId>hsqldb</artifactId> | |
<version>2.2.8</version> | |
<scope>test</scope> | |
</dependency> | |
</dependencies> | |
</project> |
<?xml version="1.0" encoding="UTF-8"?> | |
<beans xmlns="http://www.springframework.org/schema/beans" | |
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jdbc="http://www.springframework.org/schema/jdbc" | |
xmlns:tx="http://www.springframework.org/schema/tx" | |
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd | |
http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd | |
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd | |
"> | |
<jdbc:embedded-database id="dataSource" type="HSQL"> | |
</jdbc:embedded-database> | |
<bean id="sessionFactory" | |
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> | |
<property name="dataSource" ref="dataSource" /> | |
<property name="packagesToScan" value="net.twasink.hsqldbtest" /> | |
<property name="hibernateProperties"> | |
<props> | |
<prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> | |
<prop key="hibernate.hbm2ddl.auto">create</prop> | |
<prop key="hibernate.show_sql">true</prop> | |
</props> | |
</property> | |
<!-- Another way of indicating that we want to update the schema; Spring | |
calls this _after_ the session factory is created, while the hbm2ddl flag | |
above is processed by Hibernate _during_ creationo f the session factory. | |
<property name="schemaUpdate" value="true" /> --> | |
</bean> | |
<bean id="transactionManager" | |
class="org.springframework.orm.hibernate3.HibernateTransactionManager"> | |
<property name="sessionFactory" ref="sessionFactory" /> | |
</bean> | |
<tx:annotation-driven /> | |
</beans> |
Thanks for very helpful tutorial. I’m new in Java and Hibernate as well. I managed to compile the code and understood the concept as well. But the problem is that I don’t know how to execute the code to debug some stuff. When I start app as java application in eclipse. I have a long list to of option. But I don’t see my actual test class to run. So How to run it and debug this app? Please see the link I asked same question in the stackoverflow @ http://stackoverflow.com/questions/26563177/using-in-memory-database-with-hibernate-tutorial-how-to-execute
How would I use the embedded data source for a hsqldb on a file?
Hi. Im having those errors:
Results :
Tests in error:
shouldHaveNoObjectsAtStart(datasource.FooTest): Foo is not mapped [from Foo]
shouldBeAbleToPersistAnObject(datasource.FooTest): Foo is not mapped [from Foo]
shouldBeABleToQueryForObjects(datasource.FooTest): Foo is not mapped [from Foo]
You are having those errors because maybe you are using a different package structure.
Check the below line in 'testContext.xml' -
<property name="packagesToScan" value="net.twasink.hsqldbtest" />
If you are using a different package then Spring would not be able to scan it for finding the Table mapping. Update it as per your package structure and check if it works.
Nice work
I found out that these two artifacts conflict:
In facto, the first one seems to contain all the classes of the second one and you can have strange runtime errors if you keep both.