Java 如何使用Hibernate和H2数据库自动生成主键
我正在使用Spring 4,并为我的数据模型设置了以下内容: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")
@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);
}
}