Spring JPA CrudRepository save (Entity) возвращает 0 в поле id - PullRequest
0 голосов
/ 29 сентября 2018

Я добавляю Spring JPA / Hibernate 5 к старому проекту.Я использую метод CrudRepository .save(Entity) для таблицы Mainframe/DB2.Строка вставлена ​​просто отлично, но returnedEntity.getIdColumn() содержит 0.Мне действительно нужен идентификатор для дальнейшей обработки.Может ли кто-нибудь помочь, пожалуйста?Большое спасибо!

@Entity
Table(name="MY_TABLE")
public class myClass {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(name="ID_COLUMN")
private Long idColumn;
...

}

Идентификация - единственный работающий тип стратегии.Вот класс обслуживания:

@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 голосов
/ 03 октября 2018

Оказалось, что в моей таблице уже был определен генератор последовательности идентификаторов в БД.Итак, после того, как я изменил его на generationType. SEQUENCE все заработало.@GeneratedValue (стратегии = GenerationType.SEQUENCE, генератор = "MY_TABLE_SEQ")

0 голосов
/ 25 мая 2019

Недавно я столкнулся с подобной проблемой.

В моем случае новая сущность была передана из пользовательского интерфейса, и 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);
}

PS: когда идентификатор объекта был равен 0, Hibernate использовал стратегию merge, однако, вместо этого следует persist стратегия для новых сущностей ( ссылка для реализации save метода ).

0 голосов
/ 29 сентября 2018

Я предполагаю, что вы пытаетесь получить идентификатор, прежде чем ваша транзакция будет сброшена в БД.Таким образом, JPA не знает, какой идентификатор будет назначен, и возвращает 0.

Отредактировано : я бы порекомендовал что-то вроде этого:

@Transactional
public Entity save( .....) {
   //some code
   repository.save(entity);
   //some code
   return entity;
}

Транзакция будетбыть очищенным в конце этого метода, и сущность, которая будет возвращена из него, должна иметь реальный идентификатор.

...