【问题标题】:How to auto generate a primary key using Hibernate and an H2 database [duplicate]如何使用 Hibernate 和 H2 数据库自动生成主键 [重复]
【发布时间】: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 注释,主键也不会自动生成。

【问题讨论】:

    标签: java sql spring hibernate h2


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-20
      • 1970-01-01
      • 2016-12-23
      相关资源
      最近更新 更多