3

I am having an issue on configuring my model to create database tables. I am using a h2 embedded database since it is a prerequisite for my project. I have created the entity class with the necessary data annotations. I created the persistence.xml file where I set hibernate.hbm2dll.auto to "create" since I would like the db to be created when the application will run for the first time. Please find below my entity and the persistence.xml file configuration:

    package org.crowdlib.main;

import java.io.Serializable;

import javax.persistence.*;
import org.hibernate.cfg.*;
import org.hibernate.tool.hbm2ddl.*;

@Entity
@Table(name = "tblperson")
public class Person implements Serializable {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int Id;
    @Column(name = "name", nullable = false)
    private String Name;

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String name) {
        Name = name;
    }
}

And the file is:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    version="1.0">
    <persistence-unit name="kot">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <class>org.crowdlib.main.Person</class>
        <properties>
            <property name="hibernate.connection.url" value="jdbc:h2:./db/dbpersons" />
            <property name="hibernate.connection.driver_class" value="org.h2.Driver" />
            <property name="hibernate.connection.username" value="test" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.hbm2dll.auto" value="create"></property>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"></property>
        </properties>
    </persistence-unit>
</persistence>

The client is:

public static void main(String[] args)
    {


        Person t = new Person();
        t.setName("hi");

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("kot");
        EntityManager em = emf.createEntityManager();

        em.getTransaction().begin();
        em.persist(t);
        em.getTransaction().commit();
    }

The strange thing is that I can see that h2 database file is created. I can see that a user test is created as well. I receive the following error message:Caused by: org.h2.jdbc.JdbcSQLException: Table "TBLPERSON" not found;

This makes me conclude that JPA is not creating the tables. Am I missing smth in persistence.xml?

EDIT

Nov 16, 2015 11:26:42 AM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation
INFO: HHH000204: Processing PersistenceUnitInfo [
    name: kot
    ...]
Nov 16, 2015 11:26:42 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core {5.0.2.Final}
Nov 16, 2015 11:26:42 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Nov 16, 2015 11:26:42 AM org.hibernate.cfg.Environment buildBytecodeProvider
INFO: HHH000021: Bytecode provider name : javassist
Nov 16, 2015 11:26:42 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}
Nov 16, 2015 11:26:43 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!)
Nov 16, 2015 11:26:43 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000401: using driver [org.h2.Driver] at URL [jdbc:h2:./db/dbpersons]
Nov 16, 2015 11:26:43 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000046: Connection properties: {user=test}
Nov 16, 2015 11:26:43 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH000006: Autocommit mode: false
Nov 16, 2015 11:26:43 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Nov 16, 2015 11:26:43 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Hibernate: 
    insert 
    into
        tblperson
        (id, name) 
    values
        (null, ?)
Nov 16, 2015 11:26:44 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 42102, SQLState: 42S02
Nov 16, 2015 11:26:44 AM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Table "TBLPERSON" not found; SQL statement:
insert into tblperson (id, name) values (null, ?) [42102-190]
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1692)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1602)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1608)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1152)
    at org.crowdlib.main.dbMain.main(dbMain.java:26)
Caused by: org.hibernate.exception.SQLGrammarException: could not prepare statement
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:106)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:182)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareStatement(StatementPreparerImpl.java:108)
    at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.prepare(IdentityGenerator.java:78)
    at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:39)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2791)
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3361)
    at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:474)
    at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:179)
    at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:163)
    at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:198)
    at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:317)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:272)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:178)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:109)
    at org.hibernate.jpa.event.internal.core.JpaPersistEventListener.saveWithGeneratedId(JpaPersistEventListener.java:67)
    at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:189)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:132)
    at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:58)
    at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:774)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:747)
    at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:752)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:1146)
    ... 1 more
Caused by: org.h2.jdbc.JdbcSQLException: Table "TBLPERSON" not found; SQL statement:
insert into tblperson (id, name) values (null, ?) [42102-190]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.command.Parser.readTableOrView(Parser.java:5293)
    at org.h2.command.Parser.readTableOrView(Parser.java:5270)
    at org.h2.command.Parser.parseInsert(Parser.java:1030)
    at org.h2.command.Parser.parsePrepared(Parser.java:400)
    at org.h2.command.Parser.parse(Parser.java:304)
    at org.h2.command.Parser.parse(Parser.java:276)
    at org.h2.command.Parser.prepareCommand(Parser.java:241)
    at org.h2.engine.Session.prepareLocal(Session.java:460)
    at org.h2.engine.Session.prepareCommand(Session.java:402)
    at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1188)
    at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:72)
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:276)
    at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1122)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$2.doPrepare(StatementPreparerImpl.java:106)
    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:172)
    ... 23 more
MIlena
  • 257
  • 1
  • 4
  • 13
  • Could you try changing this to `` or `` Please update the question with complete exception stack trace – SyntaX Nov 16 '15 at 06:48
  • Thank you for your response. I have tried it with both create-update and update and the error msg is the same. I'm trying to create the db table from the entity thats why I use name="hibernate.hbm2dll.auto" value="create". It's so strange because if I create the table manually and if I change name="hibernate.hbm2dll.auto" to value="update" the query is executed and the record is added to the db. But I have this requirement of generating the db from entities as well. – MIlena Nov 16 '15 at 11:31
  • http://stackoverflow.com/questions/16417425/error-using-hibernate-with-h2-in-memory-database – Alan Hay Nov 16 '15 at 11:37
  • The question you linked doesn't solve the problem. I already checked that question. It is just suggesting to create the table when the application will run for the first time and then change it to validate. I have done that before as well and it doesn't work. I have also added INIT=CREATE SCHEMA IF NOT EXISTS but still it doesn't work. Same error message. – MIlena Nov 16 '15 at 16:25
  • Okay thank you very much for all your responses. The connection succeeded after copy/pasting the persistence.xml from another project. It is quite strange because after setting all the fields for this particular project everything got to be as the initial persistence configuration but with a big difference... this time it succeeded on creating all the tables. I don't get it. What I could think of is that since I've copied the text from an internet tutorial there might have been some problems with chars and formatting. I don't know. I found no difference between the two files – MIlena Nov 17 '15 at 13:20

0 Answers0