gpt4 book ai didi

java - 为什么 Hibernate 尝试插入具有已存在 id 的新记录?

转载 作者:行者123 更新时间:2023-11-30 02:55:50 25 4
gpt4 key购买 nike

为什么 Hibernate 尝试使用现有 id 插入新记录?

保存前的类别表(通过插入手动填充)

ID | NAME  | IMAGE
1 | 'NAME'| 'IMAGE'

保存代码

//Category{id=0, name='NAME', image='IMAGE', parent=null}
getCurrentSession().save(category);

应使用 id 2 插入。

类别Java代码

@Entity
@Table(name = "CATEGORY",
indexes = {
@Index(name = "CATEGORY_NAME_INDEX",
columnList = "CATEGORY_NAME")})
public class Category implements NamedModel {
@Id
@Column(name = "CATEGORY_ID")
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
@NotNull
@Size(min = 1, max = 256)
@Column(name = "CATEGORY_NAME", length = 256)
private String name;
@OneToOne(fetch = FetchType.EAGER)
@JoinTable(name = "CATEGORY_RELATIONS",
joinColumns = {
@JoinColumn(name = "CATEGORY_RELATIONS_CATEGORY_ID",
referencedColumnName = "CATEGORY_ID")},
inverseJoinColumns = {
@JoinColumn(name = "CATEGORY_RELATIONS_PARENT_ID",
referencedColumnName = "CATEGORY_ID")})
private Category parent;
@OneToMany(cascade = {CascadeType.REMOVE, CascadeType.PERSIST},
fetch = FetchType.LAZY, mappedBy = "parent")
private List<Category> children;
}

解决方案

//Category
@GeneratedValue(strategy = GenerationType.IDENTITY)

//CategoryRelations
@Entity
@IdClass(CategoryRelationsPrimaryKey.class)
public static class CategoryRelationsPrimaryKey implements Serializable {
private Long categoryId;
private Long parentId;

而不是长。

最佳答案

这是因为您直接从数据库而不是从应用程序(即 ORM)删除/添加了记录,这就是不再维护 hibernate_sequence 中的值的原因。

Hibernate 在 hibernate_sequence 表中维护值,该表将在创建新记录时插入。

更新 hibernate_sequence 中的 next_val 列值以解决问题。

您可以使用注释@GenerateValue(strategy = GenerationType.IDENTITY)将主键生成委托(delegate)给数据库。

关于java - 为什么 Hibernate 尝试插入具有已存在 id 的新记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37229053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com