Вы, кажется, слишком усложняете это.
1) У вас есть @JoinColumn(referencedColumnName = "id")
, но это избыточно.Это то, на что в любом случае ссылается внешний ключ, поэтому вам не нужно явно об этом говорить.Не беспокойтесь, но не пишите код, который вам не нужен.
2) Если у вас есть parentId в новом подкомментарии, вам не нужно искать его и добавлять в список родительского комментария.Концепция, которую вы здесь упускаете, - это концепция «владения» сущностью.Посмотрите на Javadoc для mappedBy
.Поскольку поле parentComment
выполняет сопоставление, оно определяет сущность-владелец.Конечно, это та же сущность, но дело в том, что поле parentComment
контролирует постоянство.Вам не нужно ничего добавлять к Set
из subComments
, чтобы отношения сохранялись.Вы можете сделать это, если хотите, но JPA проигнорирует это.Вам нужно только установить поле parentComment
.Например,
Редактировать: этот пример с JPA вместо Spring Data, но тот же под капотом.
Ваша сущность должна быть только:
@Entity
public class Comment {
@Id @GeneratedValue
private Integer id;
@OneToMany(mappedBy="parentComment")
private Set<Comment> subComments;
@ManyToOne
private Comment parentComment;
и выиспользуйте это так:
private void run() {
runWrite();
runRead();
Comment comment = new Comment();
comment.setId(1);
Comment subComment = new Comment();
subComment.setParentComment(comment);
runSaveSubComment(subComment);
runRead();
}
private void runWrite() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence");
em = emf.createEntityManager();
tx = em.getTransaction();
try {
tx.begin();
Comment comment = new Comment();
Comment subComment = new Comment();
subComment.setParentComment(comment);
em.persist(comment);
em.persist(subComment);
tx.commit();
} finally {
emf.close();
}
}
private void runRead() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence");
em = emf.createEntityManager();
try {
Comment comment = em.createQuery("select c from Comment c left join fetch c.subComments where c.id = :id", Comment.class).setParameter("id", 1).getSingleResult();
System.out.println(comment + Arrays.toString( comment.getSubComments().toArray()) );
} finally {
emf.close();
}
}
private void runSaveSubComment(Comment subComment) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence");
em = emf.createEntityManager();
tx = em.getTransaction();
try {
tx.begin();
em.persist(subComment);
tx.commit();
} finally {
emf.close();
}
}
или если вы хотите сделать с Spring Data.
Comment comment = new Comment();
Comment sub1 = new Comment();
sub1.setParentComment(comment);
repo.save(comment);
repo.save(sub1);
Comment parentComment = repo.fetchSubCommentsById(1);
System.out.println(parentComment + Arrays.toString(parentComment.getSubComments().toArray()));
Comment sub2 = new Comment();
sub2.setParentComment(parentComment);
repo.save(sub2);
parentComment = repo.fetchSubCommentsById(1);
System.out.println(parentComment + Arrays.toString(parentComment.getSubComments().toArray()));
// or
Comment p = new Comment();
p.setId(1);
Comment sub3 = new Comment();
sub3.setParentComment(p);
repo.save(sub3);
parentComment = repo.fetchSubCommentsById(1);
System.out.println(parentComment + Arrays.toString(parentComment.getSubComments().toArray()));