JPA Hibernate 3.6.8.Final, PostgreSQL 9.1, SQLGrammarException - problème de configuration? Bizarre instruction SQL

Modifier:
RÉSOLU
La droite. J'ai trouvé la chose qui me confond.
J'ai utiliser pgadmin pour créer des tables et d'autres base de données internes, vérifié dès maintenant: si au moins une lettre dans le nom de (nom de la table, le nom de colonne, pk nom, etc) est en majuscule, puis pgadmin l'utilise dans le code SQL de création de script tel qu'il est, à l'aide de guillemets, de sorte que PostgreSQL interprète le nom tel qu'il a été écrit. Si vous exécutez le script suivant:

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;_

il crée tout en minuscules, et l'original Sample.java version fonctionne très bien.


Quel est le problème ici? Cette question est-elle spécifique à PostgreSQL 9.1 ou PostgreSQL en général, ou certains hibernate est manquant?

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();
    }
}

Exception:

...
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
 ...

Évidemment, cette instruction SQL ci-dessus:

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

n'est pas exécutée avec succès à partir de PostgreSQL lui-même (à partir de pgadmin).

Mais, si je change Sample.java pour:

@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;
    }
}

qui est bizarre, il fonctionne.

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

Est mise en veille prolongée.le dialecte inutile ici, ou il ne fonctionne pas correctement avec PostgreSQL 9.1?
Aussi, je voudrais pas pour les colonnes de type de noms, si elles sont les mêmes que le terrain, mais en majuscules, est-il possible aussi?

Merci.

Si vous supprimez les hibernate dialecte liés à la propriété - que ça va marcher? AFAIR la @Entity(\""..."\") construire est de forcer la JPA fournisseur à utiliser la valeur exacte fournie (par exemple, utiliser exactement le cas de le nom de la table). Je ne sais pas pourquoi dans votre cas, il faire de la magie.
J'ai essayé sans le dialecte, l'original Sample.java ne fonctionne pas, modifiés, également essayé d'utiliser MySQL dialecte au lieu de PostgreSQL, juste pour s'attendre à voir des avertissements ou des erreurs, le résultat est le même, il semble que le dialecte est ignoré b) le dialecte n'est pas utilisée lors de la construction des requêtes SQL, mais probablement seulement pour le vendeur comportement spécifique, comme la pagination, par exemple.
et si vous essayez d'utiliser la JPA propriétés de la connexion JDBC (vogella.de/articles/JavaPersistenceAPI/...) et de supprimer le dialecte et hibernate propriétés liées? Quel est exactement le nom de la table dans votre base de données?
PostgreSQL script: CREATE TABLE "ÉCHANTILLON" ( "ID" integer not NULL, "TITLE" caractère variable(100) not NULL, CONSTRAINT "SAMPLE_ID_PK" CLÉ PRIMAIRE ("ID" ) ) AVEC ( OID=FALSE ); ALTER TABLE "ÉCHANTILLON" PROPRIÉTAIRE DE postgres;

OriginalL'auteur akazlou | 2011-11-14