JPA не генерирует идентификатор для объекта - PullRequest
0 голосов
/ 07 августа 2020

У меня есть следующий класс

  @Entity
  public class Comment {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "comment_id")
    private Long commentId;

    @Column(name = "creator_id")
    private Long creatorId;

    @Column(name = "text")
    @ApiModelProperty(value = "Text des Kommentar")
    private String text;

    @Column(name = "timestamp")
    @ApiModelProperty(value = "Zeitstempel der letzten Bearbeitung")
    private String timestamp;


    protected Comment() {}
    
    public Comment(CommentDto dto) {
      this();
      updateComment(dto);
    }

    private void updateComment(CommentDto dto) {
      setText(dto.getText());
      setCreatorId(dto.getCreatorId());
      setTimestamp(UtilService.getTimestampString());
    }

Я получаю CommentDto из моего HTTP-запроса, состоящего из текста и creatorId.

Насколько я понимаю, commentId должен быть сгенерировано с помощью вызова пустого конструктора.

В моем сервисе я делаю следующее:

public void addComment(CommentDto comment) {
  Comment commentEntity = new Comment(comment);
  commentRepository.save(commentEntity);
}

с commentRepository как Autowired JPARepository<Comment, Long>

Проблема заключается в том, что идентификатор не создается, и я получаю сообщение об ошибке при попытке вставить объект в мою БД с нулевым идентификатором.

1 Ответ

2 голосов
/ 07 августа 2020
@GeneratedValue(strategy = GenerationType.IDENTITY)

Вы используете GenerationType.IDENTITY, что означает IdentityGenerator, который ожидает значений, сгенерированных столбцом идентификаторов в базе данных, то есть они автоматически увеличиваются. Сделайте автоматически увеличивающийся первичный ключ в базе данных, чтобы решить эту проблему.

Или вы можете использовать GenerationType.AUTO, который является стратегией по умолчанию. Во время фиксации стратегия AUTO использует глобальный генератор чисел для генерации первичного ключа для каждого нового объекта сущности. Эти сгенерированные значения уникальны на уровне базы данных и никогда не используются повторно.

@Id
@GeneratedValue
@Column(name = "comment_id")
private Long commentId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...