Hibernate - JPA 在不同情况下生成具有相同名称的重复表
Hibernate - JPA generates duplicate tables with same name in different case
我正在重新学习 Hibernate 和 JPA。我正在为我的环境使用 Spring Boot、Gradle 和 Postgres。我有一组访问 Postgres 数据库的域对象。两个对象不使用注解,使用一个JDBC模板class进行数据库操作。另一组域对象使用 JPA 注释。 JPA 对象集使用 JPA 注释映射出关系。当我 运行 我的单元测试检查 JDBC 模板对象的数据库实体时,一切都很好。当我检查数据库时,我发现我使用注释为那些域对象创建了重复的实体。
我已经检查了项目的注释和设置,但未能成功找到我的错误。
这是我的 class 定义:
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
@Entity(name="AcceptanceCriteria")
@Table(name="accCriteria_tbl", schema="ia_req_changes")
@SequenceGenerator(name="AcceptCritera_SEQ_GEN", schema="ia_req_changes", sequenceName = "accCriteria_tbl_accCri_id_seq", initialValue = 1, allocationSize = 1)
public class AcceptanceCriteria implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="AcceptCritera_SEQ_GEN")
@Column(name="accCri_id", updatable = false)
private Long accCri_id;
@Column(name="accAction")
private String accAction;
@Column(name="accControl")
private String accControl;
@Column(name="accAccptCriteria")
private String accAccptCriteria;
@Column(name="lastModified")
private Timestamp lastModified;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FK_funcReq_id", referencedColumnName = "funcReq_id")
private FunctionalRequirement functionalReq;
public AcceptanceCriteria() {
}
这里是 Postgres 的 table。明显的区别是我用 DDL 创建的 table 是 table 名称大写的那个。
如有任何建议或建议,我们将不胜感激。
谢谢,
拉斯
在 Postgres 中,可以通过双引号创建 tables(和列),名称区分大小写。例如,创建一个 table
create table some_case (id bigint);
尝试重新创建
create table Some_Case (id bigint);
结果为
ERROR: relation "some_case" already exists
但用双引号。
create table "Some_Case" (id bigint);
它有效,您最终会遇到现在的情况。我猜 table 有大写字母是故意用这种方式创建的,它在你的 JDBC 模板中是这样工作的吗?
请参阅此相关 post:Are PostgreSQL column names case-sensitive?
在 JPA
s @Table
注释中声明 table 名称时,它总是变为小写。为了处理这种情况,可能会有这样的调整 post 描述
然而,最好的办法是 - 如果可能的话 - 遵循 "de facto" 约定,全部小写。换句话说,将数据从大写 table 复制到小写 table,删除大写 table 并可能检查 JDBC 模板 类 是否需要任何修改,因为
搜索 Stack Overflow 也提供了其他解决方案。
向“@Table”注释添加转义双引号也可能有效,例如
@Table(name="\"accCriteria_tbl\""
参见 。仍然可能不是长期的最佳解决方案。
我正在重新学习 Hibernate 和 JPA。我正在为我的环境使用 Spring Boot、Gradle 和 Postgres。我有一组访问 Postgres 数据库的域对象。两个对象不使用注解,使用一个JDBC模板class进行数据库操作。另一组域对象使用 JPA 注释。 JPA 对象集使用 JPA 注释映射出关系。当我 运行 我的单元测试检查 JDBC 模板对象的数据库实体时,一切都很好。当我检查数据库时,我发现我使用注释为那些域对象创建了重复的实体。
我已经检查了项目的注释和设置,但未能成功找到我的错误。
这是我的 class 定义:
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
@Entity(name="AcceptanceCriteria")
@Table(name="accCriteria_tbl", schema="ia_req_changes")
@SequenceGenerator(name="AcceptCritera_SEQ_GEN", schema="ia_req_changes", sequenceName = "accCriteria_tbl_accCri_id_seq", initialValue = 1, allocationSize = 1)
public class AcceptanceCriteria implements Serializable{
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="AcceptCritera_SEQ_GEN")
@Column(name="accCri_id", updatable = false)
private Long accCri_id;
@Column(name="accAction")
private String accAction;
@Column(name="accControl")
private String accControl;
@Column(name="accAccptCriteria")
private String accAccptCriteria;
@Column(name="lastModified")
private Timestamp lastModified;
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "FK_funcReq_id", referencedColumnName = "funcReq_id")
private FunctionalRequirement functionalReq;
public AcceptanceCriteria() {
}
这里是 Postgres 的 table。明显的区别是我用 DDL 创建的 table 是 table 名称大写的那个。
如有任何建议或建议,我们将不胜感激。
谢谢,
拉斯
在 Postgres 中,可以通过双引号创建 tables(和列),名称区分大小写。例如,创建一个 table
create table some_case (id bigint);
尝试重新创建
create table Some_Case (id bigint);
结果为
ERROR: relation "some_case" already exists
但用双引号。
create table "Some_Case" (id bigint);
它有效,您最终会遇到现在的情况。我猜 table 有大写字母是故意用这种方式创建的,它在你的 JDBC 模板中是这样工作的吗? 请参阅此相关 post:Are PostgreSQL column names case-sensitive?
在 JPA
s @Table
注释中声明 table 名称时,它总是变为小写。为了处理这种情况,可能会有这样的调整 post 描述
然而,最好的办法是 - 如果可能的话 - 遵循 "de facto" 约定,全部小写。换句话说,将数据从大写 table 复制到小写 table,删除大写 table 并可能检查 JDBC 模板 类 是否需要任何修改,因为
搜索 Stack Overflow 也提供了其他解决方案。
向“@Table”注释添加转义双引号也可能有效,例如
@Table(name="\"accCriteria_tbl\""
参见