Мне понадобится момент, чтобы объяснить это, поэтому, пожалуйста, останься со мной. У меня есть таблица NewsFeed
, которая имеет отношения OneToMany с самим собой.
@Entity
public class NewsFeed(){
...
@ManyToOne(optional=true, fetch=FetchType.LAZY)
@JoinColumn(name="REPLYTO_ID")
private NewsFeed replyTo;
@OneToMany(mappedBy="replyTo", cascade=CascadeType.ALL)
private List<NewsFeed> replies = new ArrayList<NewsFeed>();
public void addReply(NewsFeed reply){
replies.add(reply);
reply.setReplyTo(this);
}
public void removeReply(NewsFeed reply){
replies.remove(reply);
}
}
Итак, вы можете так думать. Каждый канал может иметь List
ответов, которые также являются типом NewsFeed
. Теперь мне очень легко удалить исходный фид и вернуть обновленный список. Все, что мне нужно сделать после удаления, это.
feeds = scholarEJB.findAllFeed(); //This will query the db and return updated list
Но у меня возникает проблема при попытке удалить replies
и вернуть обновленный список. Итак, вот как я удаляю replies
. Внутри моего управляемого JSF bean у меня есть
//Before invoke this method, I have the value of originalFeed, and deletedFeed set.
//These original feeds are display inside a p:dataTable X, and the replies are
//displayed inside p:dataTable Y which is inside X. So when I click the delete button
//I know which feed I want to delete, and if it is the replies, I will know
//which one is its original post
public void deleteFeed(){
if(this.deletedFeed != null){
scholarEJB.deleteFeeds(this.deletedFeed);
if(this.originalFeed != null){
//Since the originalFeed is not null, this is the `replies`
//that I want to delete
scholarEJB.removeReply(this.originalFeed, this.deletedFeed);
}
feeds = scholarEJB.findAllFeed();
}
}
Внутри моего EJB ученого EJB у меня есть
public void removeReply(NewsFeed feed, NewsFeed reply){
feed = em.merge(feed);
comment.removeReply(reply);
em.persist(comment);
}
public void deleteFeeds(NewsFeed e){
e = em.find(NewsFeed.class, e.getId());
em.remove(e);
em.getEntityManagerFactory().getCache().evict(NewsFeed.class); //Like fdreger suggested
}
Когда я выхожу, сущность (ответ) корректно удаляется из базы данных, но внутри feeds
List, ссылка на нее reply
все еще существует. Это только до тех пор, пока я не выйду из системы и не вернусь назад, когда ответ исчезнет.