为什么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;
而不是长。
答案 0 :(得分:2)
这是因为你直接从数据库中删除/添加了一条记录而不是应用程序,即ORM,这就是为什么不再保留hibernate_sequence
中的值的原因。
Hibernate维护hibernate_sequence
表中的值,该表将在创建新记录时插入。
更新next_val
中的hibernate_sequence
列值以解决问题。
您可以使用注释@GeneratedValue(strategy = GenerationType.IDENTITY)
将主键生成委派给数据库。