为什么Hibernate尝试插入具有现有ID的新记录?

时间:2016-05-14 16:18:52

标签: java hibernate orm

为什么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; 

而不是长。

1 个答案:

答案 0 :(得分:2)

这是因为你直接从数据库中删除/添加了一条记录而不是应用程序,即ORM,这就是为什么不再保留hibernate_sequence中的值的原因。

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

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

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