2016-05-14 11 views
1

なぜHibernateは既存のIDを持つ新しいレコードを挿入しようとしますか?なぜHibernateは既存のIDを持つ新しいレコードを挿入しようとしますか?

カテゴリーテーブルの前に

//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; 
} 
で挿入されるべき(挿入して手動で充填した)

ID | NAME | IMAGE 
1 | 'NAME'| 'IMAGE' 

保存コードを保存

SOLUTION

//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)を使用して、プライマリキーの生成をデータベースに委任できます。

関連する問題