当前位置: 首页 > 知识库问答 >
问题:

如果已插入具有相同id的数据,则不会更新JPA自动增量

邵旺
2023-03-14

我必须用自动递增的方式分类

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

@Column(unique = true)
private String name;

@OneToMany(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER, mappedBy="category", orphanRemoval = false)
@Column(nullable = true)
private List<SubCategory> subCategoryList = new ArrayList<>();

public Category(String categoryname) {
    this.name = categoryname;
}

和子类别

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

@Column
private String name;

@JsonIgnore
@ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.EAGER)
@JoinColumn(name="category_id")
Category category;

/**
 * @param name
 */
public SubCategory(String name) {
    super();
    this.name = name;
}

我还有一个文件数据。我的类路径中的sql。当我启动spring启动应用程序以插入默认值时,将加载此文件

--insert default category
INSERT INTO public.category(id, name)   VALUES (1, 'Webtoon');
INSERT INTO public.category(id, name)   VALUES (2, 'Ebook');
INSERT INTO public.category(id, name)   VALUES (3, 'Education');

--insert sub category
INSERT INTO public.sub_category(id, name, category_id)  VALUES (1, 'Action', 1);
INSERT INTO public.sub_category(id, name, category_id)  VALUES (2, 'Adventure', 1);
INSERT INTO public.sub_category(id, name, category_id)  VALUES (3, 'Thriller', 1);

一旦应用程序启动,当我调用我的服务创建另一个子类别时,我得到一个Id发布异常

    Optional<Category> categoryOpt =  categoryService.findById(Long.parseLong("1"));
    Assert.assertTrue("The category mus be present",categoryOpt.isPresent()); //The data with id 1 is found
    Assert.assertNotNull("The category must not be null. It should be loaded from ressources", categoryOpt.get().getId());

    //Spring generate id  instead of getting the correct sequence in database
    Category category = new Category("My-Category-Test");
    category = categoryService.create(category);

    Assert.assertNotNull("Category id must not be null", category.getId());

Spring使用已经存在的数据生成自己的序列,而不是从数据库中获取正确的序列。所以我得到了一个例外:

2020-01-29 01:00:02.848跟踪9148---[nio-9103-exec-1]o.h.类型。描述符。sql。BasicBinder:绑定参数[1]为[BIGINT]-[1]2020-01-29 01:00:02.849跟踪9148---[nio-9103-exec-1]o.h.type。描述符。sql。BasicBinder:绑定参数[2]为[VARCHAR]-[My Category Test]2020-01-29 01:00:02.860 WARN 9148---[nio-9103-exec-1]o.h.引擎。jdbc。spi。SqlExceptionHelper:SQL错误:0,SQLState:23505 2020-01-29 01:00:02.860错误9148---[nio-9103-exec-1]o.h.engine。jdbc。spi。SqlExceptionHelper:ERREUR:重复键的值会打破唯一约束«sub_category_pkey»

我如何告诉JPA找到正确的序列?

共有1个答案

李甫
2023-03-14

我找到了解决办法。当id被硬编码添加时,不会使用自动增量,这就是为什么hibernate仍然指向1,例如,即使1已经被手动插入。

所以我改变了我的脚本,像这样使用自动递增

--insert default category
INSERT INTO public.category(name)   VALUES ('Webtoon');
INSERT INTO public.category(name)   VALUES ('Ebook');
INSERT INTO public.category(name)   VALUES ('Education');

--insert sub category
INSERT INTO public.sub_category(name, category_id) SELECT 'Action', id FROM public.category where public.category.name = 'Webtoon';
INSERT INTO public.sub_category(name, category_id) SELECT 'Adventure', id FROM public.category where public.category.name = 'Webtoon';
INSERT INTO public.sub_category(name, category_id) SELECT 'Thriller', id FROM public.category where public.category.name = 'Webtoon';

这样,数据库和hibernate就可以使用自动增量

 类似资料:
  • 问题内容: 我只是想将数据插入到SQL数据库表中,如果已经插入了一些数据,那么我想更新该数据。如何使用Java做到这一点。请帮助我,并提前对英语不好表示抱歉。 问题答案: 只需标识数据集中的 唯一项即可 (例如 ID 或 代码 )。然后通过使用该方法首先尝试执行 SELECT 查询。如果 结果集 是空的,执行 INSERT 别的尝试 UPDATE 细节。

  • 问题内容: 再会。我有3张桌子: tblWarehouse产品 : tblBranchProducts : tblStockMoves : 基本上,该过程是分支X从仓库Y请求产品。然后仓库Y创建一个请求订单(称为“ 库存移动” )并将请求存储在 tblStockMove中 。 说这种情况,我们有一个参考编号为XYZ的库存移动: (其中产品ID 1为可乐,产品ID 2为百事可乐。) 另一方面,分支X

  • 问题内容: 我想使用JLabel(Icon)来显示来自我网站(http://xxx.xxx.xxx.xxx/java_pic/test.jpg)的图像。我有一个刷新按钮来新建一个新的JLabel和ImageIcon(以获取最新的图像)该程序成功运行…但是当我上载新图像以覆盖旧图像时(http://xxx.xxx。 xxx.xxx/java_pic/test.jpg ),我按了刷新按钮…什么都没发生

  • 问题内容: 我创建了一个具有主键的表并启用了该表,如何使用MYSQL ? 这是我使用的查询,我尝试使用“”和“ 1”作为第一个值,但是它不起作用。 问题答案: 为了利用列的自动递增功能,在插入行时不要为该列提供值。数据库将为您提供一个值。

  • 问题内容: 是否可以在sql中执行更新语句,但仅在更新不同时才执行更新? 例如 如果在数据库中, 不应 执行任何类型的更新 但是,如果 这 应该 执行更新。 问题答案: 使用更新前触发器可以做到这一点。在此触发器中,您可以将旧值与新值进行比较,并在新值不变的情况下取消更新。但这将导致呼叫者网站上的错误。 我不知道为什么要这样做,但是这里有几种可能性: 性能:这里没有性能提升,因为更新不仅需要找到正

  • 问题内容: 我有一个带有2个表的数据库,如下所示: 列是,并且是 和 在申请表中,我有2个编辑框,名称分别为和 如果用户像电子邮件一样插入一个新的负责人姓名, 那么在保存表格的过程中,我想将新的负责人姓名插入表中,请插入最后一个并将其更新为。 如果用户保持名称,但它更新电子邮件一样,然后我想在从1 =使用新的电子邮件地址和他们(其余和)保持不变。 如果负责人的名称相同,我想保留from表的原始引用