我的问题如下:当我在“邮递员”应用中创建POST请求时。这就是我尝试发布的内容
{
"timestamp": "2018-11-19T20:16:00.486+0000",
"status": 500,
"error": "Internal Server Error",
"message": "could not read a hi value - you need to populate the table: hibernate_sequence; nested exception is org.hibernate.id.IdentifierGenerationException: could not read a hi value - you need to populate the table: hibernate_sequence",
"path": "/api/ver01/product"
}
我遇到以下错误:
package com.hubertkulas.webstore.store.archetype;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.math.BigDecimal;
import java.sql.Date;
@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private boolean contact;
private String email;
private String category;
private String name;
private String city;
private String model;
private BigDecimal price;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "MM-dd-yyyy")
private Date date;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCategory() {
return category;
}
public void setCategory(String category) {
this.category = category;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public boolean isContact() {
return contact;
}
public void setContact(boolean contact) {
this.contact = contact;
}
public Long getId() {
return id;
}
// setter for id because Jackson will use it
public void setId(Long id) {
this.id = id;
}
}
我在搜索框中寻找答案,但是没有一个人帮助我。所以我认为问题出在sql代码中,但我不确定。整个项目都使用intelliJ IDE编写。
这是我的产品类。
package com.hubertkulas.webstore.store.controllers;
import com.hubertkulas.webstore.store.archetype.Product;
import com.hubertkulas.webstore.store.jparepository.ProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("api/ver01/product")
public class ProductController {
//injecting ProductRepository when ProductController is called
@Autowired
private ProductRepository productRepository;
@GetMapping
public List<Product> list() {
//finds all of the records and returns it
return productRepository.findAll();
}
@PostMapping
@ResponseStatus(HttpStatus.OK)
public void create(@RequestBody Product product){
productRepository.save(product);
}
@GetMapping("/{id}")
public Product get(@PathVariable("id") long id){
// return specific record with added id
return productRepository.getOne(id);
}
}
这是我的ProductController类
package com.hubertkulas.webstore.store.jparepository;
import com.hubertkulas.webstore.store.archetype.Product;
import org.springframework.data.jpa.repository.JpaRepository;
//Using Jpa for CRUD operations
public interface ProductRepository extends JpaRepository<Product, Long> {
}
这是我的ProductRepository界面
CREATE TABLE
product
(
id BIGINT NOT NULL,
contact BOOLEAN NOT NULL,
email VARCHAR,
category VARCHAR,
name VARCHAR,
city VARCHAR,
date DATETIME,
price NUMERIC,
model VARCHAR,
PRIMARY KEY (id)
);
CREATE TABLE
hibernate_sequence
(
next_val BIGINT
);
INSERT INTO product (id, contact, email, category, name, city, date, price)
VALUES (1, 1, 'abraham@site.com', 'Electronics', 'Abraham Westbrom', 'New
York', 4419619200000, '3250');
INSERT INTO product (id, contact, email, category, name, city, date, price)
VALUES (2, 1, 'udon@site.com', 'Electronics', 'Udon Hon', 'London',
4419619200000, '799');
INSERT INTO product (id, contact, email, category, name, city, date, price)
VALUES (3, 0, 'mateuszsinus@site.com', 'Software', 'Mateusz Sinus',
'Warsaw', 4419619200000, '10000');
INSERT INTO hibernate_sequence (next_val) VALUES (4);
这是我的数据库
{{1}}
答案 0 :(得分:1)
您可以添加
spring:
jpa:hibernate:ddl-auto: create-drop
在application.yml文件或application.properties文件中
仅当表被截断时才执行此操作,否则可以添加INSERT INTO <schema_name>.hibernate_sequence (next_val) VALUES (1);
答案 1 :(得分:0)
您的hibernate_sequence
表错误。
请参见2.6.10. Using identifier table:
create table hibernate_sequences( sequence_name VARCHAR NOT NULL, next_val INTEGER NOT NULL )
答案 2 :(得分:0)
如果要使用Spring Boot为本地数据库创建模式,并且将jpa配置为执行自动创建放置,那么理想情况下,您将不会遇到这种情况。
spring.jpa.hibernate.ddl-auto=create-drop
但是在登台/生产中,您要分别处理模式定义(DDL),因此hibernate_sequence需要具有初始值,并且0应该足以开始。它告诉程序库从哪个编号开始自动生成ID。
spring.jpa.hibernate.ddl-auto=validate
INSERT INTO <schema_name>.hibernate_sequence (next_val) VALUES (0);
以上内容适用于MYSQL