![](/img/trans.png)
[英]Saving entity tries to insert new record instead of merging with previous record
[英]Why Hibernate tries to insert new record with existed id?
為什么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
列值以解決該問題。
您可以使用Annotation @GeneratedValue(strategy = GenerationType.IDENTITY)
將主鍵生成委派給數據庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.