Postgres没有用hibernate正确创建表?

Posted

技术标签:

【中文标题】Postgres没有用hibernate正确创建表?【英文标题】:Postgres not creating tables properly with hibernate? 【发布时间】:2016-10-25 03:06:09 【问题描述】:

我已将我的休眠应用程序设置为使用以下属性:

spring.datasource.url: jdbc:postgresql://localhost:5432/users
spring.datasource.username=james
spring.datasource.password=root
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=create-drop
#spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
#spring.jpa.database: mysql
spring.jpa.database =  postgresql
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

我还创建了一个 postgres 数据库 users,但是当我运行我的应用程序时,它会抛出所有这些不成功的 alter table 错误?!

Hibernate: drop table if exists user cascade
2016-06-23 10:46:05.406 ERROR 3364 --- [  restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: drop table if exists user cascade
2016-06-23 10:46:05.407 ERROR 3364 --- [  restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport  : ERROR: syntax error at or near "user"
  Position: 22

Hibernate: alter table user_credential drop constraint FK_14ncv1m0gqncrbiagrs4uaqo8
2016-06-23 10:36:36.199 ERROR 3235 --- [  restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: alter table user_credential drop constraint FK_14ncv1m0gqncrbiagrs4uaqo8
2016-06-23 10:36:36.199 ERROR 3235 --- [  restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport  : ERROR: relation "user_credential" does not exist
Hibernate: alter table user_roles drop constraint FK_5q4rc4fh1on6567qk69uesvyf
2016-06-23 10:36:36.200 ERROR 3235 --- [  restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: alter table user_roles drop constraint FK_5q4rc4fh1on6567qk69uesvyf
2016-06-23 10:36:36.200 ERROR 3235 --- [  restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport  : ERROR: relation "user_roles" does not exist
Hibernate: alter table user_roles drop constraint FK_g1uebn6mqk9qiaw45vnacmyo2
2016-06-23 10:36:36.200 ERROR 3235 --- [  restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: alter table user_roles drop constraint FK_g1uebn6mqk9qiaw45vnacmyo2
2016-06-23 10:36:36.200 ERROR 3235 --- [  restartedMain] org.hibernate.tool.hbm2ddl.SchemaExport  : ERROR: relation "user_roles" does not exist

在 mysql 上一切正常,它创建的表没有任何戏剧性,我在 mysql 中使用了以下属性:

#spring.datasource.url: jdbc:mysql://localhost/users
#spring.datasource.username=root
#spring.datasource.password=root
#spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.jpa.hibernate.ddl-auto=create-drop
##spring.jpa.hibernate.ddl-auto=update
#spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
#spring.jpa.database: MySql
#spring.jpa.database-platform=org.hibernate.dialect.MySQLDialect
##spring.jpa.database-platform=org.hibernate.spatial.dialect.mysql.MySQLSpatialDialect

可能是因为我使用了来自vividsolutions 的Point 数据类型?

import com.vividsolutions.jts.geom.Point;
@Column(name = "coords", columnDefinition="Geometry", nullable = true)
private Point location;

我是否需要做其他事情才能让 hibernate 使用 postgres?我也在我的 postgres 服务器上设置了postgis

我删除了 Point 声明,它仍然抛出相同的错误...所以这不是问题。

【问题讨论】:

【参考方案1】:

事实证明,postgres 中不能有一个名为 user 的表。因此,只需将表名从 user 更改为 user_entity 即可解决此问题。

【讨论】:

@MatheusAraujo 我会说这是在不直观的软件中需要的知识,而这些软件总是很糟糕的软件。经验不能成为程序员在编写不够直观的软件时所浪费的时间。 你也不能有名为 user 的列! @KarlRichter 至少在 2020 年这似乎不是真的。这对我有用,没有任何问题。 CREATE TABLE if not exists mynamespace.user(id text, "user" text ); 不过,结合 JPA,我遇到了与问题中所示相同的问题【参考方案2】:

由于接受的答案似乎不是最新的,我想提出不同的解决方案:

注意:我猜您正在使用 JPA 并命名您的实体用户。 还要注意 \"

@Entity(name = "\"User\"")
public class User implements Serializable 
...

顺便说一句:名为“授权”的实体也会出现同样的问题

虽然这适用于当前的 postgres / hibernate 版本,但我宁愿建议将实体命名为 user_entity 或 users。

【讨论】:

【参考方案3】:

如果您有关系字段,只需使用 CascadeType.All:

@ManyToMany(fetch = EAGER, cascade = CascadeType.ALL)
private Collection<Role> roles = new ArrayList<>();

【讨论】:

以上是关于Postgres没有用hibernate正确创建表?的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate 继承 - 没有用 Id 注释的字段

Spring应用程序没有在Postgres数据库上创建表

春天寻找我没有用 java.sql.SQLSyntaxErrorException 创建的表:表 'meetings.meeting' 不存在

如何将 CLOB 与 Hibernate 以及 Postgres 和 H2 一起使用

Pandas for 循环没有用 iloc 正确更新行?

Hibernate - JPA 在不同的情况下生成具有相同名称的重复表