Hibernate - JPA在不同的情况

时间:2017-11-26 13:58:13

标签: hibernate jpa case-sensitive case-insensitive

我正在重新学习Hibernate和JPA。我正在为我的环境使用Spring Boot,Gradle和Postgres。我有一组访问Postgres数据库的域对象。两个对象不使用注释,并使用JDBCTemplate类进行数据库操作。另一组域对象使用JPA注释。 JPA对象集使用JPA注释映射出关系。当我运行单元测试以检查JDBC模板对象的数据库实体时,一切都很好。当我检查数据库时,我发现我有使用注释的那些域对象的重复实体。

我已经查看了我的项目注释和设置,但找不到我的错误却没有成功。

这是我的班级定义:

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的表格。明显的区别是我使用DDL创建的表是具有大写表名的表。

enter image description here

非常感谢任何建议或建议。

谢谢,

拉​​斯

1 个答案:

答案 0 :(得分:2)

在Postgres中,可以使用双引号创建区分大小写的表(和列)。例如,创建一个表

create table some_case (id bigint);

尝试再次创建

create table Some_Case (id bigint);

结果为

  

错误:关系“some_case”已经存在

但有双引号。

create table "Some_Case" (id bigint);

它有效,你将最终处于你现在拥有的状态。我猜这个有大写字母的表是故意以这种方式创建的,它在JDBC模板中是这样的吗? 请参阅此相关帖子:Are PostgreSQL column names case-sensitive?

JPA s @Table注释中声明表名时,它总是降为小写。要处理这种情况,可能会有一些调整,比如这篇文章描述Spring boot JPA insert in TABLE with uppercase name with Hibernate

然而,最好的办法 - 如果可能的话 - 将遵循“事实上的”惯例,全部小写。换句话说,将数据从大写表复制到小写表,删除upperacase表,如果需要进行任何修改,可能会检查JDBC模板类。

搜索Stack Overflow还提供其他解决方案。

将转义的双引号添加到“@Table”注释中也可能有效,例如

@Table(name="\"accCriteria_tbl\""

this answer。从长远来看,仍然可能不是最佳解决方案。