I am trying to migrate with Hibernate and HSQLDB. I tried to adapt the tutorial to more modern versions, so a problem may arise. This happens when I run unit test using JUnit.
I am using HSQLDB 2.3.2 with Hibernate (JPA) 4.3.5.
The error I am getting is this:
16: 40: 16,802 DEBUG SQL: 109 - select device0_.DEVICE_ID as DEVICE_I1_0_, device0_.DEVICE_FIRMWARE_VERSION as DEVICE_F2_0_, device0_.DEVICE_IMAGE as DEVICE_I3_0_ from DEVICES device0_ limit? 16: 40: 16,802 DEBUG SQL: 109 - select device0_.DEVICE_ID as DEVICE_I1_0_, device0_.DEVICE_FIRMWARE_VERSION as DEVICE_F2_0_, device0_.DEVICE_IMAGE as DEVICE_I3_0_ from DEVICES device0_ limit? 16: 40: 16,802 DEBUG SQL: 109 - select device0_.DEVICE_ID as DEVICE_I1_0_, device0_.DEVICE_FIRMWARE_VERSION as DEVICE_F2_0_, device0_.DEVICE_IMAGE as DEVICE_I3_0_ from DEVICES device0_ limit? 16: 40: 16,803 WARN SqlExceptionHelper: 144 - SQL Error: -5501, SQLState: 42501 16: 40: 16,803 WARN SqlExceptionHelper: 144 - SQL error: -5501, SQLState: 42501 16: 40: 16,803 SqlExceptionHelper ERROR: 146 - not a user missing privileges or object not found: DEVICES 16: 40: 16,803 ERROR SqlExceptionHelper: 146 - user does not have enough privileges or objects not found: DEVICES 16: 40: 16,804 ERROR gwt-log: 81 - e: javax.persistence.PersistenceException: org. hibernate.exception.SQLGrammarException: could not prepare statement javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement ... Called: org.hibernate.exception.SQLGrammarException: could not prepare expression ... richinenny: java.sql.SQLSyntaxErrorException: the user does not have enough privileges or object, and found: DEVICE ... causes: org.hsqldb.HsqlException: user does not have privilege, or object not found: DEVICE ...
My persistence.xml is as follows:
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="testproject" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>testproject.server.domain.Device</class> <exclude-unlisted-classes/> <properties> <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver" /> <property name="hibernate.connection.url" value="jdbc:hsqldb:file:/db/testdb" /> <property name="hibernate.connection.username" value="sa" /> <property name="hibernate.connection.password" value="" /> <property name="connection.pool_size" value="1" /> <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect" /> <property name="current_session_context_class" value="thread" /> <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider" /> <property name="hibernate.c3p0.min_size" value="5" /> <property name="hibernate.c3p0.max_size" value="20" /> <property name="hibernate.c3p0.timeout" value="300" /> <property name="hibernate.c3p0.max_statements" value="50" /> <property name="hibernate.c3p0.idle_test_period" value="3000" /> </properties> </persistence-unit> </persistence>
My Device.java looks like this:
package testproject.server.domain; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import testproject.shared.dto.DeviceDto; @Entity @Table(name = "DEVICES") public class Device implements Serializable { private static final long serialVersionUID = 8161681740825989132L; @Id @Column(name = "DEVICE_ID") @GeneratedValue(strategy = GenerationType.IDENTITY) protected Long deviceId; @Column(name = "DEVICE_IMAGE") protected String image; @Column(name = "DEVICE_FIRMWARE_VERSION") protected String firmwareVersion; public Device() { } public Device(Long deviceId) { setDeviceId(deviceId); } public Device(DeviceDto device) { setDeviceId(device.getDeviceId()); setImage(device.getImage()); setFirmwareVersion(device.getFirmwareVersion()); } public Long getDeviceId() { return deviceId; } public void setDeviceId(Long deviceId) { this.deviceId = deviceId; } public String getImage() { return image; } public void setImage(String image) { this.image = image; } public String getFirmwareVersion() { return firmwareVersion; } public void setFirmwareVersion(String firmwareVersion) { this.firmwareVersion = firmwareVersion; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append("Device Id: ").append(getDeviceId()).append(", "); sb.append("Image: ").append(getImage()).append(", "); sb.append("Firmware Version: ").append(getFirmwareVersion()); return sb.toString(); }
and my tao looks like this:
package testproject.server.dao; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; import javax.persistence.TypedQuery; import testproject.server.domain.Device; public class DeviceDao extends BaseDao { private static final EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("testproject"); public static EntityManager createEntityManager() { return entityManagerFactory.createEntityManager(); } public Long createObject(Object object) { return createDevice((Device) object); } public List<Object> retrieveObjects(int maxResults, int firstResult) { EntityManager em = createEntityManager(); List<Object> list = null; try { TypedQuery<Object> query = em.createQuery( "select a from Device a", Object.class); query.setMaxResults(maxResults); query.setFirstResult(firstResult); list = query.getResultList(); } finally { em.close(); } return list; } public Long createDevice(Device Device) {
And finally, my test case (this sucks, I just want to run it):
package testproject.server; import java.util.List; import org.apache.log4j.xml.DOMConfigurator; import org.junit.After; import org.junit.Before; import org.junit.Test; import com.allen_sauer.gwt.log.client.Log; import testproject.server.dao.DeviceDao; import testproject.server.domain.Device; public class DeviceTestCase { private long startTimeMillis; @Before public void setUp() {
If anyone has a suggestion on how to fix this, I would be really happy as I am really stuck right now.