编辑 :已 解决 。我发现了令我困惑的事情。我使用pgadmin创建表和其他数据库内部组件,现在检查:如果名称(表名称,列名称,pk名称等)中至少有一个字母是大写字母,则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的,还是缺少一些hibernate配置?
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(); } }
例外:
... 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中不能正常工作?另外,如果列名与字段相同,我也不想键入列名,但是大写也可以吗?
谢谢。
该@Table("\"...\"")结构是迫使JPA提供商使用你提供确切的值(即使用表名的大小写)。
@Table("\"...\"")
而且,它在PostgreSQL世界中很相似。如果调用CREATE TABLE并用引号指定表名,则它将使用您指定的确切名称创建表(不仅是大小写,还包括语义-通过这种方式,您甚至可以创建名为TABLE的表):
CREATE 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"( 不是 SELECT * FROM TeSt)。
SELECT * FROM "TeSt"
SELECT * FROM TeSt
因此,如果您创建一个表,则CREATE TABLE "SAMPLE"需要指定该表@Table(name="\"SAMPLE\"")才能正常工作。
CREATE TABLE "SAMPLE"
@Table(name="\"SAMPLE\"")