消息 -“无法读取 hi 值 - 您需要填充表:hibernate_sequence”

Posted

技术标签:

【中文标题】消息 -“无法读取 hi 值 - 您需要填充表:hibernate_sequence”【英文标题】:message -"could not read a hi value - you need to populate the table: hibernate_sequence" 【发布时间】:2019-04-22 06:10:29 【问题描述】:

我的问题如下:当我在“邮递员”应用程序中创建 POST 请求时。这就是我尝试发布的内容

  "name": "John Doe", "email":"jdoe@test.com", "city": "London"

我收到以下错误:


"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"

我在搜索框中寻找答案,但没有一个能帮助我。所以我认为问题出在sql代码中,但我不确定。整个项目都是用 IntelliJ IDE 编写的。

这是我的产品类。

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;


这是我的 ProductController 类

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);



这是我的 ProductRepository 接口

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> 

这是我的数据库

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);

【问题讨论】:

请看这篇文章:confluence.atlassian.com/confkb/…也许它可以帮助你。 【参考方案1】:

您的hibernate_sequence 表有误。

见2.6.10. Using identifier table:

create table hibernate_sequences(
    sequence_name VARCHAR NOT NULL,
    next_val INTEGER NOT NULL
)

【讨论】:

我已将 'NOT NULL' 添加到我的 'next_val BIGINT' 中。它解决了这个问题,非常感谢。【参考方案2】:

如果您使用 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

【讨论】:

【参考方案3】:

你可以添加

spring:
jpa:hibernate:ddl-auto: create-drop 

在您的 application.yml 文件或 application.properties 文件中 仅当您有截断表时才执行此操作,否则您可以添加 INSERT INTO &lt;schema_name&gt;.hibernate_sequence (next_val) VALUES (1);

【讨论】:

【参考方案4】:

删除表并使用 next_val 作为主键重新创建

【讨论】:

以上是关于消息 -“无法读取 hi 值 - 您需要填充表:hibernate_sequence”的主要内容,如果未能解决你的问题,请参考以下文章

8.windows消息机制消息队列

消息队列漫谈:消息丢失,消息重复,消息积压一些处理方式

RabbitMQ 消息状态

消息队列:消息可靠性重复消息消息积压利用消息实现分布式事务

一文弄懂消息队列相关面试问题:消息可靠性重复消息消息积压利用消息实现分布式事务

消息队列中:消息可靠性重复消息消息积压利用消息实现分布式事务