【问题标题】:JPA Spring Boot postgresql : Insert data with the last IDJPA Spring Boot postgresql:使用最后一个ID插入数据
【发布时间】:2018-05-26 08:56:01
【问题描述】:

在项目部署时,我有一个带有自动增量 ID 的 MyClass 实体我有一个 init.sql 文件,通过添加两行来初始化 MY_CLASS 表 当我使用我的 Web 服务 REST 在 MY_CLASS 表中插入新行时出现问题,我有一个错误消息,即第一次单击时 id 1 和第二次单击时 id 2 的重复键,但在 POST 之后没有问题。为了解决这个问题,我可以在我的 init.sql 文件中添加以下行

ALTER SEQUENCE MY_CLASS_id_seq RESTART WITH 3;

我的问题:我如何配置我的 POST 以保留最后一个 id 的数据,因为只要我可以使用 SQL 插入数据。

@Entity
@Cacheable
@Getter
@Setter
@Table(name = "MY_CLASS")
public class MyClass {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotNull
    private String label;

}



@RepositoryRestResource(collectionResourceRel = "clazz", path = "clazz")
public interface MyClassRepository extends PagingAndSortingRepository<MyClass, Long> {

}

init.sql

INSERT INTO public.MY_CLASS (label) values('label_1');
INSERT INTO public.MY_CLASS (label) values('label_2');

【问题讨论】:

    标签: postgresql rest jpa spring-boot


    【解决方案1】:

    你不会使用序列生成器吗?

    public class MyClass {
         public static final String SEQUENCE_NAME = "MY_CLASS_id_seq";
    
         @Id
         @GeneratedValue(strategy = SEQUENCE, generator = SEQUENCE_NAME)
         @SequenceGenerator(name = SEQUENCE_NAME, sequenceName = SEQUENCE_NAME)
         private Long id;
    
         @NotNull
         private String label;
    }
    

    【讨论】:

    • 你的建议解决了我的问题,只是 id 跳到 50 而不是使用最后一个 id 3。我不明白为什么 50,如果我在 init.sql 文件中用 50 行初始化我的数据库不会问问题
    • 当 Hibernate 使用序列生成器时,它不会每次都获取序列值。取而代之的是,它会抓取一些 id(默认为 50)并自行管理它们。无论如何,如果使用每个序列数并且它们之间存在间隙,您不必担心。
    猜你喜欢
    • 2019-12-01
    • 2018-07-10
    • 2017-06-07
    • 2021-02-25
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    相关资源
    最近更新 更多