我正在将Spring JPA / Hibernate 5添加到一个旧项目中。我正在针对CrudRepository .save(Entity)
表运行Mainframe/DB2
方法。该行插入得很好,但是returnedEntity.getIdColumn()
中有0
。我确实需要ID进行进一步处理。有人可以帮忙吗?非常感谢你!
@Entity
Table(name="MY_TABLE")
public class myClass {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID_COLUMN")
private Long idColumn;
...
}
身份是唯一有效的策略类型。 这是Service类:
@Transactional
public Entiry insertEntity(Entity originalEntity) {
return MyRepository.save(originalEntity);
}
Runner class:
Entity originalEntity = createEntity();
Entity returnedEntity = ServiceClass.insertEntity(originalEntity);
System.out.println(originalEntity.getIdColumn());
System.out.println(returnedEntity.getIdColumn());
答案 0 :(得分:3)
我的猜测是,您正在尝试获取ID,然后再将事务刷新到DB。因此,JPA不知道将分配什么ID并返回0。
已编辑: 我建议吃这样的东西:
@Transactional
public Entity save( .....) {
//some code
repository.save(entity);
//some code
return entity;
}
此方法结束时将刷新事务,并且从该方法返回的实体应具有真实ID。
答案 1 :(得分:0)
原来,我的表具有一个在数据库中已定义的ID序列生成器。因此,在将其更改为generationType.SEQUENCE后,它可以很好地工作。 @GeneratedValue(strategy = GenerationType.SEQUENCE,generator =“ MY_TABLE_SEQ”)
答案 2 :(得分:0)
最近,我遇到了类似的问题。
在我的情况下,新实体已从UI传递,并且 ID为0而不是NULL (因为ID的类型在Java方面是原始的)。因此,Hibernate没有使用正确的save
策略。
最终,我将类型从long
更改为Long
,它有所帮助:
private long id;
private Long id;
update
的方法也从以下更改:
@PutMapping("/{id}")
public T update(@PathVariable ID id, @Valid @RequestBody T entity) {
this.getService().update(entity);
return entity;
}
收件人:
@PutMapping("/{id}")
public T update(@PathVariable ID id, @Valid @RequestBody T entity) {
return this.getService().update(entity);
}
P.S .:当实体ID为0时,Hibernate使用的是merge
策略,但是对于新实体(link for implementation of save
method)应该使用persist
策略。