Управляемый объект инструментируется провайдером персистентности, поэтому его поля находятся в некоем перехваченном состоянии.
В вашем случае прямой доступ, который вы сделали, - это доступ к тегам нулевого указателя вашего объекта. , В идеале код должен получать доступ к спискам, используя соответствующие поля получателя.
Ваш код должен измениться на:
public void addTag(Tag tag) {
getTags().add(tag);
tag.getPosts().add(this);
}
Даже в этом случае вы можете столкнуться с NPE или указанными c исключениями если основной поставщик сохраняемости уже исключил сущность из EntityManager, что делает его неуправляемым.
Поскольку вы используете Apache Tomee 8, я предлагаю вам создать аннотированную функцию DAO @Transactional, чтобы добавить тег к пост и позвони из своего сервлета. Таким образом, ваш DAO будет иметь следующий код:
@Transactional
public Post addTag(Integer postId, String tagContents) {
Post p = findById(postId); // assuming it exists, null checks should be made
Tag t = new Tag(tagContents);
// You may call p.addTag(t) here, as defined above, instead of the following code
p.getTags().add(t);
t.getPosts().add(p);
return p;
}
Надеюсь, это поможет!