Прежде всего вам не нужно устанавливать @GeneratedValue
для идентификатора, если вы используете @MapsId
.Во-вторых, вам также нужно установить объект публикации комментария.В-третьих, вам нужно использовать @JsonManagedReference
и @JsonBackReference
, если вы хотите сериализовать с использованием Джексона, чтобы избежать бесконечного цикла, или @JsonIgnore
, чтобы избежать поля, которое может создать бесконечный цикл, что означает, что ваш код будет выглядеть следующим образом:
@Data
@Entity
public class Post implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// @JsonManagedReference
@OneToMany(mappedBy = "post", cascade = CascadeType.ALL)
private Set<Comment> comments;
}
и
@Data
@Entity
public class Comment implements Serializable {
@Id
private Long id;
private String comment;
// @JsonBackReference
@JsonIgnore
@ManyToOne
@MapsId
@JoinColumn(name = "post_id") // exact foreign key name on comments table
private Post post;
}
и ваш метод сохранения из контроллера / службы, как показано ниже:
Post post = new Post();
post.setName("Post 1");
Comment comment = new Comment();
comment.setComment("comment 1");
comment.setPost(post);
Set<Comment> commentList = new HashSet<>();
commentList.add(comment);
post.setComments(commentList);
Post newPost = postRepository.save(post);
ОБНОВЛЕНИЕ
Проблема может находиться в вашей базе данных.Вам необходимо установить AUTO_INCREMENT
в поле первичного ключа.Для этого доступен ярлык.Всегда используйте SERIAL
для своего идентификатора при создании таблицы, поскольку это ярлык для BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY
.Измените идентификатор обеих таблиц с помощью SERIAL