簡體   English   中英

為什么Hibernate嘗試插入具有ID的新記錄?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM