2015-12-03 78 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