Hibernate + PostgreSQL Problem z sequence

0

Witam,
problem polega na tym, że nie udaje mi się zapisać obiektu do bazy używając id generowanego przez rdbms. Chcę używać session.save(o) zamiast pisać SQL-owe inserty z palca.

hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
    <property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
    <property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/postgres</property>
    <property name="hibernate.connection.username">postgres</property>
    <property name="hibernate.connection.password">******</property>
    <property name="hibernate.default_schema">public</property>

    <!-- JDBC connection pool (use the built-in) -->
    <property name="connection.pool_size">1</property>
    <!-- SQL dialect -->
    <property name="dialect">org.hibernate.dialect.HSQLDialect</property>
    <!-- Enable Hibernate's automatic session context management -->
    <property name="current_session_context_class">thread</property>
    <!-- Disable the second-level cache  -->
    <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
    <!-- Echo all executed SQL to stdout -->
    <property name="show_sql">true</property>
    <mapping resource="business/Human.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Human.hbm.xml
Ustawiam generowanie id na <param name="sequence">human_id_seq</param>.

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="business.Human" table="human" schema="public">
        <id name="id" type="int">
            <column name="id" />
            <generator class="sequence">
                <param name="sequence">human_id_seq</param>
            </generator>
        </id>

        <property name="name" type="string">
            <column name="name" length="30" />
        </property>
       
    </class>
</hibernate-mapping>

Human.java

package business;
public class Human implements java.io.Serializable {
     protected int id;
     // ...

table.sql
Tworzę sequence i przypisuję do id kolejne wartości.

create sequence human_id_seq;
create table Human (
	id INT NOT NULL UNIQUE DEFAULT nextval('human_id_seq'),
	name VARCHAR(30),
	
	PRIMARY KEY(id)
);

Main.java

public class Main {

    public static void main(String[] args) {

        Session session = HibernateUtils.getSessionFactory().getCurrentSession();

        session.beginTransaction();

        Human human = new Human ();
        human.setName("Wladyslaw");
        session.save(human);
        session.getTransaction().commit();
    }
}

Dostaję następujący błąd:

Hibernate: select next value for public.human_id_seq from dual_public.human_id_seq
2009-09-18 15:55:10 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 42601
2009-09-18 15:55:10 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: syntax error at or near "value"
Exception in thread "main" org.hibernate.exception.SQLGrammarException: could not get next sequence value
        at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
        at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
        at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:96)
        at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:99)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:187)
        at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:172)
        at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
        at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
        at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:535)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:523)
        at org.hibernate.impl.SessionImpl.save(SessionImpl.java:519)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301)
        at $Proxy0.save(Unknown Source)
        at hibernatetest.Main.main(Main.java:55)
Caused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near "value"
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
        at org.hibernate.id.SequenceGenerator.generate(SequenceGenerator.java:75)
        ... 16 more
Java Result: 1
0

Problem rozwiązany. W pliku konfiguracyjnym nadpisywałem sobie dialekt.

1 użytkowników online, w tym zalogowanych: 0, gości: 1