2016-05-14 60 views
1

为什么Hibernate尝试使用现有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; 

,而不是长。

回答

2

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

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

更新next_valhibernate_sequence列值来解决问题。

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

相关问题