在Spring Boot中,我使用代码优先方法创建数据库表。然后,在运行应用程序时,其中一个表的结果显示以下错误:
WARN o.h.t.s.i.ExceptionHandlerLoggedImpl.handleException - GenerationTarget encountered exception accepting command : Error executing DDL "alter table statistic add date timestamp" via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceExcepti
on: Error executing DDL "alter table statistic add date timestamp" via JDBC Statement]
oracle.jdbc.OracleDatabaseException: ORA-00904: : invalid identifier
类实体如下:
@Entity
@Table(name = "statistic")
public class Statistic {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String title;
private Long value;
private Date date;
private String unit;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Long getValue() {
return value;
}
public void setValue(Long value) {
this.value = value;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
}
有人知道问题出在哪里吗?
2条答案
按热度按时间o7jaxewo1#
这是错误的:
date
是Oracle数据类型的“保留字”。将列名更改为其他名称,例如datum
、c_date
、statistic_date
、...然后跑dffbzjpn2#
如果您有此问题,且解决方案对您(像我一样)不起作用,请尝试在物业中进行设置:
spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy
我会试着给你一个大局。Oracle中的表确实有一个列,其中使用了关键字,其名称为DATE。我已经找到了三种方法来解决它,但没有一种方法对我不起作用。这些方法包括:
1.使用双引号进行手动转义,如“”Date“”
1.使用特定于休眠的反勾号字符(如“‘Date’”)进行手动转义
1.spring.jpa.properties.hibernate.globally_quoted_identifiers=true此设置会在其他表中导致问题,因此不适用于我。也许有一个特定的案例。
问题出在小写的柱的建筑名称上。Hibernate使用类似<ALIAS_TABLE>_.“date”的模式构建查询--在我的例子中--但Oracle返回了一个错误。当我将“Date”更改为“Date”时,在SQLDeveloper上成功执行了查询。因此,问题是Hibernate不区分大小写,但对Oracle来说确实很重要。物理策略的属性允许Hibernate使用与注解相同的列名构建查询--它是有效的。我不知道这种情况可能会发生在Oracle 12以外的其他数据库中,但Oracle确实有。