5

編集解決済み 右。私は私を混乱させたものを見つけました。私は pgadmin を使用してテーブルやその他のデータベースの内部を作成し、現在チェックしています: 名前 (テーブル名、列名、pk 名など) の少なくとも 1 文字が大文字の場合、pgadmin は SQL 作成スクリプトでそれを使用しますそのまま、二重引用符を使用するため、PostgreSQL は名前を書かれたとおりに解釈します。次のスクリプトを実行する場合:

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

すべて小文字で作成され、元の Sample.java バージョンは正常に動作します。


ここで何が問題なのですか?この問題は PostgreSQL 9.1 または PostgreSQL 全般に固有のものですか、それとも一部の休止状態の構成が欠落していますか?

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>

サンプル.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();
    }
}

例外:

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

明らかに、上記のこの SQL ステートメントは次のとおりです。

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

PostgreSQL 自体から (pgadmin から) 正常に実行されません。

しかし、 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;
    }
}

これは奇妙です、それは動作します。

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

ここで hibernate.dialect は役に立たないのですか、それとも PostgreSQL 9.1 では正しく動作しませんか? また、列名がフィールドと同じなら入力したくないのですが、大文字でも可能でしょうか?

ありがとうございました。

4

1 に答える 1

4

この@Table("\"...\"")構造は、JPA プロバイダーが提供した正確な値を使用するように強制します (つまり、テーブル名の大文字と小文字を正確に使用します)。

さらに、PostgreSQL の世界でも同様です。呼び出しCREATE TABLEてテーブル名を引用符で囲んで指定すると、指定した正確な名前のテーブルが作成されます (ケースだけでなくセマンティクスも - このようにして、TABLE という名前のテーブルを作成することもできます)。

CREATE TABLE "TeSt" ( id int PRIMARY KEY NOT NULL )

テーブルTeSt8になります。

CREATE TABLE TeSt2 ( id int PRIMARY KEY NOT NULL )

テーブルtest2になります。

したがって、「TeSt」テーブルを照会するには、実行する必要がありますSELECT * FROM "TeSt"( not SELECT * FROM TeSt )。

したがって、 でテーブルを作成する場合は、それを機能させるためCREATE TABLE "SAMPLE"に指定する必要があります@Table(name="\"SAMPLE\"")

于 2011-11-14T12:28:25.527 に答える