我尝试从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]
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
}
那是什么问题?也许与货币类型有关?
感谢和问候
答案 0 :(得分:3)
此处有2个问题:表/列名称的大小写敏感性和命名策略。
请注意错误消息中的表名,并注意大小写字母。遇到此问题时,我的假设是表名不区分大小写。至少当我编写sql查询时就是这种情况(我当时使用的是MSSQL)。但显然,JPA确实关心大小写。
关于命名策略,如果您未指定任何策略,则JPA会将具有一些大写字母(例如User_Detail
)的表名,列名转换为所有用小写和下划线分隔的名称(即{ {1}})。如果要在批注中提供表名和列名,并且不希望JPA转换它们,则将这两行添加到dbo.user_detail
中:
application.properties
答案 1 :(得分:2)
最后,我解决了这个问题。我替换了
@Table(name = "Artikel")
public class Article {
反对
@Table(name = "Artikel", schema="dbo")
public class Article {
但是dbo是用户的默认架构,因此在没有schema =“ dbo”的情况下应该可以使用。也许这是某种错误?我有人有更多信息,请让我知道...
答案 2 :(得分:0)
我将其添加到属性中,并且可以正常工作:
spring.jpa.properties.hibernate.default_schema=dbo
答案 3 :(得分:0)
如果建议使用 SQLServer 将用户映射到 dedault 数据库以避免架构出现问题,请检查: