Вам не нужно попадать в базу данных (с EntityManager#refresh()
, EntityManager.find()
не будет попадать в базу данных, если экземпляр post уже загружен в контексте постоянства), если вы правильно установили двунаправленные ассоциации.
Проблема в том, что вы этого не делаете, и ваш объектный граф нарушается после добавления комментария, поэтому возникает необходимость перезагрузить сообщение из базы данных (что на самом деле является обходным решением настоящей ошибки).
По сути, ваша модель выглядит следующим образом:
+-------+ 1 * +-------+ * 1 +-------+
| Post | <--------> |Comment| <--------> | User |
+-------+ +-------+ +-------+
Поэтому при добавлении комментария необходимо правильно установить обе стороны всех двунаправленных ассоциаций:
String username = getLoginName();
if(username != null)
{
User u = userBean.getUser(username);
post = postBean.getPost(post.getId());
post.getComments().add(comment);
comment.setPost(post);
u.getComments().add(comment);
comment.setUser(u);
commentBean.updateComment(comment);
//post = postBean.getPost(post.getId()); // you should not have to do this
}
return "viewpost?faces-redirect=true";
«Установка обеих сторон ссылки двунаправленной ассоциации» обычно выполняется вспомогательными методами для сущностей, например, в Post:
@Entitysamples
public class Post {
...
public void addToComments(Comment comment) {
this.comments.add(comment);
comment.setPost(this);
}
}
Это менее подвержено ошибкам, проще в использовании, легчечитать.
В любом случае, ключ состоит в том, чтобы установить обе стороны ваших ассоциаций, вам не нужно принудительно перезагружать базу данных, чтобы "исправить" ваш граф объектов.