为什么我的Spring Boot实体ID生成失败?

时间:2019-05-02 15:53:36

标签: spring hibernate spring-boot entity

我正在尝试为我的实体自动生成ID,但是没有生成。相反,它在数据库中已经存在ID为“ 1”的条目时从1开始。为什么没有为我的新实体生成ID“ 9”?

enter image description here

2 个答案:

答案 0 :(得分:1)

通常,在postgres上使用GenerationType.IDENTITY创建表时,Hibernate会设置id列以及数据库序列来管理此id。

按照惯例,序列名称将为“ 表名 _id_seq”。例如,对于表class Menu extends React.Component { state = { collapsed: false, categories: [] }; componentDidMount() { axios .get("https://www.ifixit.com/api/2.0/categories") .then(response => this.setState({ categories: response.data})); } render() { const { categories } = this.state; return ( <div> {Object.keys(categories).map((item, i) => ( <li key={i}> <span>{categories[item]}</span> </li> ))} </div> ); } } export default Menu; ,将有一个相应的序列ad_group_action。您可以连接到数据库以再次检查创建的实际序列名称。

序列从1开始,每次Hibernate插入一行时递增。

但是,如果存在预先存在的行-或者如果将具有现有ID的行“手动”插入到表中,则这些行可能与序列冲突。

一种解决方案是简单地使用以下方法将序列(从pgAdmin或另一个数据库客户端)重置为从更高的数字开始(例如100):

ad_group_action_id_seq

现在,Hibernate将不会与现有行冲突(假设其最大id为<100)。

或者,当手动插入行时,省略id列,然后让postgres自动设置它们。这样,表格和序列将始终保持同步。

答案 1 :(得分:0)

可以分享您的表定义吗?

CREATE TABLE ad_group_action...