Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Hibernate和H2数据库自动生成主键_Java_Sql_Spring_Hibernate_H2 - Fatal编程技术网

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

Java 如何使用Hibernate和H2数据库自动生成主键,java,sql,spring,hibernate,h2,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")

我正在使用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上):

将值(100100)插入实例_数据(使用堆_,最大堆_)

我得到的错误是:错误:列“INSTANCE\u DATA\u ID”不允许为NULL; SQLState:23502

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


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

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

像这样注释id getter

@Id
@Column(name="InstanceDataId")
@GeneratedValue(strategy=GenerationType.AUTO)
public Long getInstanceDataId() {
    return instanceDataId;
}
如果您不想创建原始sql方案,您可以构建类似的东西(当然,它只使用inmemory db工作)


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

好的,我可以从我的应用程序中执行该操作。但是我想用初始值预先填充db进行测试,并希望在外部执行。我担心的是,当Hibernate创建模式时,如果主键设置为auto increment,则无法正确创建模式。
@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);
    }
}