Spring JPA CrudRepository save(Entity)在id字段中返回0

时间:2018-09-29 01:37:33

标签: spring hibernate db2 spring-data-jpa

我正在将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());

3 个答案:

答案 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策略。