Hibernate:架构验证:缺少表

kno*_*dge 6 sql sql-server hibernate

我尝试从 MSSQL Server 2016 数据库中的现有表中读取数据。如果我验证(hbm2ddl.auto --> 验证),我会收到异常“架构验证:缺少表”。

我将生成的 Hibernate SQL 代码(如果我从验证切换到更新)与我可以在 MSSQL Server 本身中生成的 SQL 代码进行了比较。它看起来是相同的:

-- generated SQL from Hibernate 
create table Artikel (
       Artnr int not null,
        Artgruppe CHAR(5),
        Bezeichnung VARCHAR(30) not null,
        EPreis money,
        primary key (Artnr)
    )

-- generated SQL from MSSQL Server 2016
CREATE TABLE [dbo].[Artikel](
    [Artnr] [int] NOT NULL,
    [Bezeichnung] [varchar](30) NOT NULL,
    [EPreis] [money] NULL,
    [Artgruppe] [char](5) NULL,
PRIMARY KEY CLUSTERED 
(
    [Artnr] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

Java 模型是:

@Entity
@Table(name = "Artikel")
public class Article {
    @Id
    @Column(name = "Artnr", nullable=true)
    private int article_id;

    @Column(name = "Bezeichnung", columnDefinition="VARCHAR(30)", nullable=false)
    private String description;


    @Column(name = "EPreis", columnDefinition = "money", nullable=true)
    private BigDecimal price;

    @Column(name = "Artgruppe", columnDefinition="CHAR(5)")
    private String article_group;


    // getters and setters
    // ... not shown here
}
Run Code Online (Sandbox Code Playgroud)

那么问题出在哪里呢?也许这与金钱类型有关?

感谢致敬

Vor*_*yev 6

这里有 2 个问题:表/列名称中的大小写敏感度命名策略

请注意错误消息中的表名,并注意大小写字母。当我遇到这个问题时,我的假设是表名不区分大小写。至少当我编写 sql 查询时是这样(在我的例子中我使用的是 MSSQL)。但显然,JPA 确实关心区分大小写。

关于命名策略,如果您没有指定任何策略,JPA 会将带有一些大写字母(例如User_Detail)的表、列名称转换为全部小写且下划线分隔的名称(即dbo.user_detail)。如果您在注释中提供表和列名称,并且不希望 JPA 转换它们,请将这两行添加到您的application.properties

spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
Run Code Online (Sandbox Code Playgroud)


kno*_*dge 4

最后我解决了这个问题。我更换了

@Table(name = "Artikel")
public class Article {
Run Code Online (Sandbox Code Playgroud)

反对

@Table(name = "Artikel", schema="dbo")
public class Article {
Run Code Online (Sandbox Code Playgroud)

但 dbo 是用户的默认架构,因此无需 schema="dbo" 即可工作。也许这是某种错误?有人有更多信息请告诉我...