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)
那么问题出在哪里呢?也许这与金钱类型有关?
感谢致敬
这里有 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)
最后我解决了这个问题。我更换了
@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" 即可工作。也许这是某种错误?有人有更多信息请告诉我...