У меня есть следующий код Springboot:
Комментарий.java
@Entity
@Getter @Setter @NoArgsConstructor @RequiredArgsConstructor
public class Comment extends Auditable {
@Id
@GeneratedValue
private Long id;
@NonNull
private String comment;
@ManyToOne(fetch = FetchType.LAZY)
private Link link;
}
Ссылка.java
@Entity
@Getter @Setter @NoArgsConstructor @RequiredArgsConstructor
public class Link extends Auditable {
@Id
@GeneratedValue
private Long id;
@NonNull
private String title;
@NonNull
private String url;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "link")
private List<Comment> comments = new ArrayList<>();
public void addComment(Comment c) {
comments.add(c);
}
}
И следующий бегун:
@Bean
CommandLineRunner someRunner(LinkRepository lr, CommentRepository cr) {
return args -> {
Link link = new Link("Getting started", "url");
Comment c = new Comment("Hello!");
link.addComment(c);
linkRepository.save(link);
};
};
Я пытаюсь, чтобы комментарий был привязан к ссылке, и оба сохранялись вместе. Тем не менее, это вывод:
[
{
createdBy: null,
createdDate: "2/28/19, 11:48 PM",
lastModifiedBy: null,
lastModifiedDate: "2/28/19, 11:48 PM",
id: 2,
comment: "Hello!",
link: null
}
]
Любые советы о том, как я могу заставить ссылку действительно отображаться в списке ссылок?





В двунаправленной связи вы должны установить обе стороны связи;
Link link = new Link("Getting started", "url");
Comment comment = new Comment("Hello!");
comment.setLink(link); // missing in your code
link.addComment(comment);
linkRepository.save(link);
Отметьте "Двунаправленные ассоциации «многие к одному»" > здесь.
Привет, спасибо, у меня сложилось впечатление, что CascadeType.ALL будет применяться и к связанным объектам (например, к комментарию)? Отсюда: stackoverflow.com/a/13027444/1876047
Понятно, я бы подумал, что из-за того, что у меня в аннотации был параметр mappedBy, это было бы сделано автоматически, но, похоже, это не так. Есть ли способ настроить его так, чтобы, когда я добавляю комментарий к ссылке, он автоматически добавлял ссылку к комментарию? Я полагаю, что мог бы сделать что-то вроде comment.setLink(this) в методе addComment, но я надеялся на какую-то автоматическую конфигурацию, позволяющую SpringBoot подбирать ее автоматически.
@MrD У меня точное мышление, но я не уверен, почему его нет. Может быть, есть какой-то случай, когда это нарушает вышележащую логику постоянства? Кажется очень тривиальным, но нам нужно быть явным и делать это вручную... У нас было 50 таблиц, связанных с одной родительской таблицей, в пределах 5-ступенчатой глубокой иерархии. Вы представляете ужас? Я создал целую автоматизированную общую структуру сущностей, чтобы справиться с ней, как вы предлагаете = P
Имеет смысл, спасибо, пока я просто добавил comment.setLink(this); в методе addComment, и, похоже, он работает. Спасибо за вашу помощь!
Вам нужно добавить
c.setLink(this);в методaddComment.