Не могу вставить в отношение ManyToMany в JPA - PullRequest
0 голосов
/ 09 апреля 2020

Я не могу вставить тег, связанный с сообщением с отношением ManyToMany в JPA. Я продолжаю иметь ошибку, говоря, что мой Набор тегов в сущности Поста НЕДЕЙСТВИТЕЛЕН, однако я проверил, что я правильно создал. Вот образец кодов для этой части. Когда я пытаюсь добавить тег, я получаю сообщение об ошибке, в котором говорится, что набор тегов в моей записи: NULL Запись:

@Entity
@Table(name = "posts")
public class Post implements Serializable  {

    private static final long serialVersionUID = 1L;

    @Id
    @Column(nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;

    @Column(name = "author", nullable = false)
    private String auteur;

    @Column(nullable = false)
    private String content;

    @ManyToMany(cascade={CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    @JoinTable(name = "post_tag",
            joinColumns = { @JoinColumn(name = "post_id") },
            inverseJoinColumns = { @JoinColumn(name = "tag_id") })    
       // private List<Tag> tags = new ArrayList<>();
     private Set<Tag> tags= new HashSet<>();
    public Post() {
        super();
    }

        public void addTag(Tag tag) {
         if(this.tags != null) {
                this.tags.add(tag);
                tag.getPosts().add(this);
            } 

        }
        public void removeTag(Tag tag) {
            tags.remove(tag);
            tag.getPosts().remove(this);
        }

    public Set<Tag> getTags() {
            return tags;
        }

    @JsonIgnore
        public void setTags(Set<Tag> tags) {
            this.tags = tags;
        }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Post)) return false;
        //return id != null && id.equals(((Post) o).getId());
        return this != null && this.equals(((Post) o).getId());
    }

    @Override
    public int hashCode() {
        return 31;
    }       

Запись тега:

    @Entity
@Table(name = "tag")
public class Tag implements Serializable {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @Column(nullable = false)
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @Column(nullable = false)
    private String content;


     @ManyToMany(mappedBy = "tags",  cascade= {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.LAZY)
    //  @ManyToMany(mappedBy = "tags")
        private Set<Post> posts = new HashSet<>();
    public Tag() {
        super();
    }

    public Tag(String content) {
        //this.id = id;
        this.content = content;
        //this.posts = new HashSet<Post>();
    }
public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Set<Post> getPosts() {
        return posts;
    }

    @JsonIgnore
    public void setPosts(Set<Post> posts) {
        this.posts = posts;
    }
**Servlet to ADD Tag to Post:**


    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String tag_cont = request.getParameter("NewTag");

        int id = Integer.parseInt(request.getParameter("postId"));
        if (!tag_cont .isEmpty()) {

                Tag t = new Tag(tag_cont);
                Post post = postDAO.findById(id);
                post.addTag(t);



            }
*

ОШИБКА:

   État HTTP 500 – Erreur interne du serveur
Type Rapport d'exception

description Le serveur a rencontré une erreur interne qui l'a empêché de satisfaire la requête.

exception

java.lang.NullPointerException
    com.reddit.entities.Post.addTag(Post.java:106)
    com.projet.servlet.AddTagPost.doPost(AddTagPost.java:43)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:660)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    org.apache.openejb.server.httpd.EEFilter.doFilter(EEFilter.java:65)
note La trace complète de la cause mère de cette erreur est disponible dans les fichiers journaux de ce serveur.

Apache Tomcat (TomEE)/9.0.30 (8.0.1)

1 Ответ

0 голосов
/ 10 апреля 2020

Управляемый объект инструментируется провайдером персистентности, поэтому его поля находятся в некоем перехваченном состоянии.

В вашем случае прямой доступ, который вы сделали, - это доступ к тегам нулевого указателя вашего объекта. , В идеале код должен получать доступ к спискам, используя соответствующие поля получателя.

Ваш код должен измениться на:

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;
}

Надеюсь, это поможет!

...