如何使用 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 jpa在内存数据库中设置h2?

如何计算使用 Hibernate 对 H2 数据库进行的 SQL 查询的数量

使用 H2 数据库自动创建的 Spring Boot

通过使用 MySQL 的 DataJpaTest 存储库测试,Hibernate 不会在 H2 DB 中将用户设置为自动增量

如何避免“无法确定数据库名称 [H2] 的 Hibernate 方言!”?