spring data rest hibernate 是小写所有表名并忽略 @Table("Name")

Posted

技术标签:

【中文标题】spring data rest hibernate 是小写所有表名并忽略 @Table("Name")【英文标题】:spring data rest hibernate is lower casing all table names and ignores @Table("Name") 【发布时间】:2016-07-19 05:30:46 【问题描述】:

我正在尝试将 spring-data-rest 与 mysql 一起使用,并将 hibernate 作为 JPA 提供程序。

我希望查询中使用的表名与类的简单名称相匹配;而已。我如何做到这一点?

我已经尝试了所有的命名策略,但似乎都没有效果。另外,我加了

@Table("Foo")

它也会小写

这是错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: 表 'TEST.worker' 不存在

这是实体:

@Entity
public class Worker 
    private Long id;
    private String givenName;
    private String familyName;
    private LocalDate dob;
    private String nationalId;
    private byte[] photo;

    public Worker() 
        this.id = Math.abs(new Random().nextLong());
    

    @Id
    @Column(name = "ID")
    public Long getId() 
        return id;
    

    public void setId(Long id) 
        this.id = id;
    

    @Basic
    @Column(name = "GivenName")
    public String getGivenName() 
        return givenName;
    

    public void setGivenName(String givenName) 
        this.givenName = givenName;
    

    @Basic
    @Column(name = "FamilyName")
    public String getFamilyName() 
        return familyName;
    

    public void setFamilyName(String familyName) 
        this.familyName = familyName;
    

    @Basic
    @Column(name = "DOB")
    public LocalDate getDob() 
        return dob;
    

    public void setDob(LocalDate dob) 
        this.dob = dob;
    

    @Basic
    @Column(name = "NationalID")
    public String getNationalId() 
        return nationalId;
    

    public void setNationalId(String nationalId) 
        this.nationalId = nationalId;
    

    @Basic
    @Column(name = "photo")
    public byte[] getPhoto() 
        return photo;
    

    public void setPhoto(byte[] photo) 
        this.photo = photo;
    

我的相关配置:

spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
spring.jpa.show-sql=true
spring.jpa.generate-ddl = false
spring.jpa.hibernate.ddl-auto = none
spring.jpa.hibernate.naming-strategy=org.springframework.boot.orm.jpa.hibernate.SpringNamingStrategy

来自 spring 数据的传递依赖:

[INFO] |  +- org.hibernate:hibernate-entitymanager:jar:4.3.11.Final:compile
[INFO] |  |  +- org.hibernate:hibernate-core:jar:4.3.11.Final:compile
[INFO] |  |  +- org.hibernate.common:hibernate-commons-annotations:jar:4.0.5.Final:compile
[INFO] |  |  \- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile

This link 不适用;

【问题讨论】:

查看this 的帖子。这可能会有所帮助。 this question 中提供的任一解决方案都适合您吗? 你使用哪个 Hibernate 版本? @Chatoyancy 实际上是的。我自己无意中偶然发现了它,但您的链接有效。如果您愿意,可以将其作为答案提供。我基本上回溯了堆栈以弄清楚它是如何到达该表名的,并使用了一些来自 intellij 的自动完成来到达那里。我没有早点找到它,因为我似乎问错了问题,它引导我找到与操作系统相关的答案。 【参考方案1】:

由于您使用的是 SpringNamingStrategy,它使用与 Hibernate 中的 ImprovedNamingStrategy 相同的值(验证它 here)。

如果您查看ImprovedNamingStrategy 的链接,您会看到tableName 的默认行为是将所有混合大小写的名称小写,这似乎是您的情况。

【讨论】:

是的,我发现了这一点并将其更改为 EJB 策略。谢谢! 如果 EJB 策略不适合您的需求,您也可以扩展策略并简单地更改此行为。 我遇到了同样的问题。使用 ***.com/questions/28571848/… 中描述的 spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl 解决了问题

以上是关于spring data rest hibernate 是小写所有表名并忽略 @Table("Name")的主要内容,如果未能解决你的问题,请参考以下文章

Spring-Data-Rest 验证器

排除 Spring-data-rest 资源的部分字段

如何在 Spring-Data-Rest 中实现细粒度的访问控制?

初入spring boot(八 )Spring Data REST

Spring-Data-Rest中时间的数据类型

您如何保护 Spring Boot / Spring-Data Rest 以便用户只能访问他自己的实体