[英]Spring hibernate: org.hibernate.exception.SQLGrammarException
[英]InvalidDataAccessResourceUsageException: org.hibernate.exception.SQLGrammarException:
我有以下問題我已經卡了一段時間:
我收到此錯誤: org.springframework.dao.InvalidDataAccessResourceUsageException:無法准備語句; SQL [調用休眠序列的下一個值]; 嵌套異常是 org.hibernate.exception.SQLGrammarException:無法准備語句
我發現有這個錯誤的人會得到它,因為他們使用保留字作為表名,但我認為這不是我的問題。
我的兩個 model 類如下。 我正在跳過 getter/setter 和 constructors
@Entity
@Table(name = "GATEWAY_MODEL")
public class GetewayModel implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "serial_number", nullable = false, length = 12, updatable = true)
private String serialNumber;
@Column(name = "name", nullable = false, length = 12, updatable = true)
private String name;
@Column(name = "ipFour", nullable = false, length = 12, updatable = true)
private String ipFour;
@Column(name = "peripheral_devices", updatable = true)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "gateway")
private Set<PeripheralDevicesModel> peripheralDevices = new HashSet<PeripheralDevicesModel>();
@Entity
@Table(name = "PERIPHERAL_DIVICES_MODEL")
public class PeripheralDevicesModel {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "uID", nullable = false)
private String uID;
@Column(name = "vendor", nullable = false)
private String vendor;
@Column(name = "date_created", nullable = false)
private Date dateCreated;
@Enumerated(EnumType.STRING)
@Column(name = "status")
private Status status;
@JsonIgnore
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "gateway")
private GetewayModel gateway;
然后在主要的 class 中,我嘗試輸入一些數據,如下所示:
@Bean
CommandLineRunner initDatabase(GatewayRepository gatewayRepo, PeripheralDevicesRepository devicesRepo) {
Set<PeripheralDevicesModel> devicesSet = new HashSet<>();
GetewayModel gateway = new GetewayModel();
gateway.setId(123l);
gateway.setSerialNumber("1123");
gateway.setName("gateway");
gateway.setIpFour("1.160.10.240");
PeripheralDevicesModel devices = new PeripheralDevicesModel();
devices.setId(1234l);
devices.setuID("2");
devices.setDateCreated(new Date());
devices.setGateway(gateway);
devices.setStatus(Status.OFFLINE);
devices.setVendor("vendor");
devicesSet.add(devices);
gateway.setPeripheralDevices(devicesSet);
return args -> {
gatewayRepo.save(gateway);
devicesRepo.save(devices);
};
我猜這是一些問題,因為我的 model 數據中的 OneToMany 關系。
我從堆棧跟蹤中獲得了更多信息
調用 hibernate_sequence 的下一個值 2020-06-26 08:34:53 - SQL 錯誤:90036,SQLState:90036 2020-06-26 08:34:53 - 找不到序列“HIBERNATE_SEQUENCE”; SQL 語句:調用 hibernate_sequence [90036-200] 的下一個值 2020-06-26 08:34:53 -
您是否知道如何解決此問題或為什么它不起作用。 謝謝
配置.屬性:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# Enabling H2 Console
spring.h2.console.enabled=true
# Custom H2 Console URL
spring.h2.console.path=/h2
spring.jpa.hibernate.ddl-auto=none
#Turn Statistics on and log SQL stmts
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.generate_statistics=false
#logging.level.org.hibernate.type=trace
#logging.level.org.hibernate.stat=debug
logging.pattern.console=%d{yyyy-MM-dd HH:mm:ss} - %msg%n
更新:在生成 GenerationType.IDENTITY 之后,我現在收到以下錯誤:
Hibernate:
select
getewaymod0_.id as id1_0_1_,
getewaymod0_.ip_four as ip_four2_0_1_,
getewaymod0_.name as name3_0_1_,
getewaymod0_.serial_number as serial_n4_0_1_,
peripheral1_.gateway as gateway5_1_3_,
peripheral1_.id as id1_1_3_,
peripheral1_.id as id1_1_0_,
peripheral1_.date_created as date_cre2_1_0_,
peripheral1_.gateway as gateway5_1_0_,
peripheral1_.uid as uid3_1_0_,
peripheral1_.vendor as vendor4_1_0_
from
gateway_model getewaymod0_
left outer join
peripheral_divices_model peripheral1_
on getewaymod0_.id=peripheral1_.gateway
where
getewaymod0_.id=?
2020-06-26 16:42:04 - SQL Error: 42102, SQLState: 42S02
2020-06-26 16:42:04 - Table "GATEWAY_MODEL" not found; SQL statement:
select getewaymod0_.id as id1_0_1_, getewaymod0_.ip_four as ip_four2_0_1_, getewaymod0_.name as name3_0_1_, getewaymod0_.serial_number as serial_n4_0_1_, peripheral1_.gateway as gateway5_1_3_, peripheral1_.id as id1_1_3_, peripheral1_.id as id1_1_0_, peripheral1_.date_created as date_cre2_1_0_, peripheral1_.gateway as gateway5_1_0_, peripheral1_.uid as uid3_1_0_, peripheral1_.vendor as vendor4_1_0_ from gateway_model getewaymod0_ left outer join peripheral_divices_model peripheral1_ on getewaymod0_.id=peripheral1_.gateway where getewaymod0_.id=? [42102-200]
2020-06-26 16:42:04 - HHH000327: Error performing load command
org.hibernate.exception.SQLGrammarException: could not prepare statement
我更改了 2 件事(除了代碼中的一些語法/錯字錯誤):
添加cascade=CascadeType.ALL
如下:
@JsonIgnore @ManyToOne(cascade=CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "gateway") private GatewayModel gateway;
您不能添加具有nullable = false
列的實體:
devices.setGateway(新 GetewayModel());
devices.setGateway(gateway);
否則,它在H2
上工作正常。
更新:
要查找的語法/錯字錯誤:
@Table(name = "PERIPHERAL_DIVICES_MODEL")
需要是@Table(name = "PERIPHERAL_DEVICES_MODEL")
public class GetewayModel
需要是public class GatewayModel
private GetewayModel gateway;
需要是private GatewayModel gateway;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.