JPA mit Hibernate 3.6.8.Finale, PostgreSQL 9.1, SQLGrammarException - Konfigurations-Problem? Komisch SQL-Anweisung

Bearbeiten:
GELÖST
Recht. Ich fand die Sache, dass verwirrt mich.
Ich nutze pgadmin zum erstellen von Tabellen und andere Datenbank-Interna, geprüft und jetzt: wenn Sie mindestens einen Buchstaben im Namen (table-name, column name, pk, name, etc) ist in dem oberen Fall ist, dann pgadmin verwendet es in der SQL-Erstellung Skript, wie es ist, mit Anführungszeichen, also PostgreSQL interpretiert den Namen als es geschrieben wurde. Wenn führen Sie das folgende Skript:

CREATE TABLE SAMPLE
(
  ID integer NOT NULL,
  TITLE character varying(100) NOT NULL,
  CONSTRAINT SAMPLE_ID_PK PRIMARY KEY (ID)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE SAMPLE
  OWNER TO postgres;_

schafft es alles in Kleinbuchstaben, und die ursprüngliche Sample.java version funktioniert gut.


Was ist hier falsch? Ist dieses Problem spezifisch für PostgreSQL 9.1 oder PostgreSQL im Allgemeinen, oder einige hibernate-Konfiguration fehlt?

persistence.xml:

<persistence-unit name="com.sample.persistence.jpa" transaction-type="RESOURCE_LOCAL">
    <class>com.sample.persistence.Sample</class>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
        <property name="hibernate.connection.url" value="jdbc:postgresql:sample"/>
        <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/>
        <property name="hibernate.connection.username" value="postgres"/>
        <property name="hibernate.connection.password" value="postgres"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hbm2ddl.auto" value="update"/>
    </properties>
</persistence-unit>

Sample.java:

@Entity
@Table(name = "SAMPLE")
public class Sample {

    @Id
    @Column(name = "ID")
    private long id;

    @Column(name = "TITLE")
    private String title;

    public String getTitle() {
        return title;
    }
}

PersistenceMain.java:

public class PersistenceMain {


    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("com.sample.persistence.jpa");
        EntityManager em = emf.createEntityManager();

        Sample sample = em.find(Sample.class, 1l);

        System.out.println("Sample Title: " + sample.getTitle());

        em.close();

        emf.close();
    }
}

Ausnahme:

...
Hibernate: 
    select
        sample0_.ID as ID0_0_,
        sample0_.TITLE as TITLE0_0_ 
    from
        SAMPLE sample0_ 
    where
        sample0_.ID=?
Exception in thread "main" javax.persistence.PersistenceException:     org.hibernate.exception.SQLGrammarException: could not load an entity:   [com.sample.persistence.Sample#1]
 ...
Caused by: org.postgresql.util.PSQLException: ERROR: relation "sample" does not exist
 ...

Offensichtlich, diese SQL-Anweisung oben:

select
    sample0_.ID as ID0_0_,
    sample0_.TITLE as TITLE0_0_ 
from
    SAMPLE sample0_ 
where
    sample0_.ID=?

wird nicht erfolgreich ausgeführt, aus der PostgreSQL selbst (von pgadmin).

Aber, wenn ich das ändern Sample.java zu:

@Entity
@Table(name = "\"SAMPLE\"")
public class Sample {

    @Id
    @Column(name = "\"ID\"")
    private long id;

    @Column(name = "\"TITLE\"")
    private String title;

    public String getTitle() {
        return title;
    }
}

ist seltsam, es funktioniert.

Hibernate: 
    select
        sample0_."ID" as ID1_0_0_,
        sample0_."TITLE" as TITLE2_0_0_ 
    from
        "SAMPLE" sample0_ 
    where
        sample0_."ID"=?
Sample Title: Sample

Ist hibernate.Dialekt nutzlos hier, oder es funktioniert nicht ordnungsgemäß mit PostgreSQL 9.1?
Ich möchte auch nicht zu geben die Spalten-Namen, wenn Sie das gleiche wie der Bereich, sondern auch im oberen Fall, ist es auch möglich?

Danke.

Wenn Sie entfernen die hibernate-dialect-Eigenschaft - wird es funktionieren? ANMUTIGEN die @Entity(\""..."\") Konstrukt zu zwingen, die JPA-provider verwenden den genauen Wert vorhanden (D. H. den genauen Fall der name der Tabelle). Weiß nicht, warum in deinem Fall tun Sie es mit einem Zauber.
Ich habe versucht, ohne Dialekt, die original Sample.java funktioniert nicht, modifiziert funktioniert, habe auch versucht, die Verwendung von MySQL-Dialekt anstelle von PostgreSQL, nur zu erwarten, zu sehen, Warnungen oder Fehler, das Ergebnis ist das gleiche, es scheint, dass a) der Dialekt wird ignoriert b) Dialekt wird nicht verwendet bei der Konstruktion der SQL-Abfragen, die aber wohl nur für vendor-spezifische Verhalten, wie Paginierung, zum Beispiel.
und was ist, wenn Sie versuchen würden, mit den JPA-Eigenschaften für die JDBC-Verbindung (vogella.de/articles/JavaPersistenceAPI/...) und entfernen Sie die Dialekt-und hibernate-Eigenschaften? Was ist der genaue Tabellenname in der DB?
PostgreSQL script: ERSTELLEN der TABELLE "SAMPLE" ( "ID" integer not NULL, "TITEL" character varying(100) not NULL, CONSTRAINT "SAMPLE_ID_PK" PRIMARY KEY ("ID" ) ) WITH ( OIDS=FALSE ); ALTER TABLE "PROBE" EIGENTÜMER postgres;

InformationsquelleAutor akazlou | 2011-11-14

Schreibe einen Kommentar