如何使用 Hibernate 和 H2 数据库自动生成主键 [重复]
Posted
技术标签:
【中文标题】如何使用 Hibernate 和 H2 数据库自动生成主键 [重复]【英文标题】:How to auto generate a primary key using Hibernate and an H2 database [duplicate] 【发布时间】:2016-03-08 14:38:12 【问题描述】:我正在使用 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 not allowed for column "INSTANCE_DATA_ID"; SQLState: 23502
我的问题是它为什么不自动生成主键?我应该如何更改我的数据模型配置以便自动生成主键(从 1 开始)?感谢您的帮助。
我想了解为什么即使我使用@GeneratedValue 注释,主键也不会自动生成。
【问题讨论】:
【参考方案1】:您为什么使用原始 SQL?只需创建 InstanceData 类的新对象,设置字段 heapUsed 和 heapMax 并使用 Hibernate 的 save() 方法。然后会自动生成id。
【讨论】:
对,我可以从我的应用程序中做到这一点。但我想用初始值预先填充数据库以进行测试,并希望在外部进行。我担心的是当 Hibernate 创建模式时,它没有正确创建它,主键设置为自动增量。【参考方案2】:像这样注释 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
【讨论】:
以上是关于如何使用 Hibernate 和 H2 数据库自动生成主键 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
java - 如何在java桌面应用程序中使用spring(事务)和hibernate创建嵌入式H2 DB?
如何计算使用 Hibernate 对 H2 数据库进行的 SQL 查询的数量
通过使用 MySQL 的 DataJpaTest 存储库测试,Hibernate 不会在 H2 DB 中将用户设置为自动增量