2015-12-03 53 views
0

我使用Spring 4,并具有以下设置为我的数据模型:如何自动生成使用Hibernate主键和H2数据库

@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上):

insert into instance_data(heap_used,heap_max)values(100,100);

我得到的错误是:错误:NULL不允许列“INSTANCE_DATA_ID”; SQLState:23502

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

我想了解为什么即使我使用@GeneratedValue批注,主键不会自动生成。

回答

0

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

+0

对,我可以从我的应用程序执行此操作。但我想预先填充数据库用于测试的初始值,并希望在外部执行。我关心的是,当Hibernate创建模式时,如果主键设置为自动增量,它不会正确创建它。 –

0

注释ID的getter这样

@Id 
@Column(name="InstanceDataId") 
@GeneratedValue(strategy=GenerationType.AUTO) 
public Long getInstanceDataId() { 
    return instanceDataId; 
} 

,如果你不想创建原始SQL方案,您可以建立与此类似(ofcourse它只能使用inmemory DB)

@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