如何使用Hibernate和H2数据库自动生成主键

时间:2015-12-03 20:07:19

标签: java sql spring hibernate h2

我使用的是Spring 4,并为我的数据模型设置了以下内容:

@Entity
@Table(name ="InstanceData")
public class InstanceData {

    private Long instanceDataId;
    private Long heapUsed; //in bytes
    private Long heapMax; //in bytes


    @Id
    @Column(name="InstanceDataId")
    @SequenceGenerator(name="DataSeq", sequenceName="DATA_SEQ")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="DataSeq")
    public Long getInstanceDataId() {
        return instanceDataId;
    }

    public void setInstanceDataId(Long id) {
        this.instanceDataId = id;
    }

    @Column(name="HeapUsed")
    public Long getHeapUsed() {
        return this.heapUsed;
    }
    public void setHeapUsed(Long heapUsed) {
        this.heapUsed = heapUsed;
    }

    @Column(name="HeapMax")
    public Long getHeapMax() {
        return this.heapMax;
    }
    public void setHeapMax(Long heapMax) {
        this.heapMax = heapMax;
    }

我让Hibernate自动创建架构。然后我尝试以下SQL(在H2 db上):

插入instance_data(heap_used,heap_max)值(100,100);

我得到的错误是:错误:列不允许NULL" INSTANCE_DATA_ID&#34 ;; SQLState:23502

我的问题是为什么它不会自动生成主键?我应该如何更改我的数据模型配置,以便自动生成主键(从1开始)?谢谢你的帮助。

我想了解为什么即使我使用@GeneratedValue注释,也不会自动生成主键。

2 个答案:

答案 0 :(得分:0)

为什么使用原始SQL?只需创建InstanceData类的新对象,设置字段heapUsed和heapMax,并使用Hibernate的save()方法。然后会自动生成id。

答案 1 :(得分:0)

像这样注释id getter

@Id
@Column(name="InstanceDataId")
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getInstanceDataId() {
    return instanceDataId;
}

如果您不想创建原始sql方案,您可以构建类似于此的东西(当然它仅使用内存数据库)

@Component
@Transactional
public class DummyDbCreator {

    private SomeService someService;

    @Autowired
    public DummyDbCreator(SomeService someService) {
        this.someService = someService;
    }

    @PostConstruct
    public void initialInserts() {
         Some some = new Some();
         // some more entites
         // ...
         // and other entites
         someService.save(some);
    }
}

将此类添加到某个组件扫描包中,或者在配置中将其声明为bean