我使用的是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" INSTANCE_DATA_ID&#34 ;; SQLState:23502
我的问题是为什么它不会自动生成主键?我应该如何更改我的数据模型配置,以便自动生成主键(从1开始)?谢谢你的帮助。
我想了解为什么即使我使用@GeneratedValue注释,也不会自动生成主键。
答案 0 :(得分:0)
为什么使用原始SQL?只需创建InstanceData类的新对象,设置字段heapUsed和heapMax,并使用Hibernate的save()方法。然后会自动生成id。
答案 1 :(得分:0)
像这样注释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