gpt4 book ai didi

hibernate - JPA 与 Hibernate 3.6.8.Final、PostgreSQL 9.1、SQLGrammarException - 配置问题?奇怪的SQL语句

转载 作者:行者123 更新时间:2023-12-04 20:19:35 25 4
gpt4 key购买 nike

编辑 :
已解决
对。我发现了让我困惑的事情。
我使用 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 配置?

持久性.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;
}
}

持久化Main.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
...

显然,上面这条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 提供程序使用您提供的确切值(即使用表名的确切大小写)。

此外,它在 PostgreSQL 世界中是相似的。如果您调用 CREATE TABLE并在引号中指定表名,然后它将创建具有您指定的确切名称的表(不仅是大小写,还有语义 - 通过这种方式,您甚至可以创建一个名为 TABLE 的表):

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

将导致表 测试8 .
CREATE TABLE TeSt2 ( id int PRIMARY KEY NOT NULL )

将导致表 测试 2 .

因此,要查询“TeSt”表,您需要执行 SELECT * FROM "TeSt" ( 不是 SELECT * FROM TeSt )。

所以,如果你用 CREATE TABLE "SAMPLE" 创建一个表您需要指定 @Table(name="\"SAMPLE\"")为了让它工作。

关于hibernate - JPA 与 Hibernate 3.6.8.Final、PostgreSQL 9.1、SQLGrammarException - 配置问题?奇怪的SQL语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8120181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com