Спящий режим не обновляет ребенка во многих отношениях - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь построить API остальных (приложение задачи списка TODO) с пружинной загрузкой и гибернацией, связь с базой данных выглядит следующим образом: у нас есть учетная запись с именем пользователя и паролем, и у нас есть задача (задача TODO), и у меня есть задача и учетная запись как сущности, и я пытаюсь обновить задачи для указанной учетной записи с помощью запроса PUT

: но вместо обновления задач определенной учетной записи программа делает это, чтобы просто добавить задачи, но не удаляя остальные ненужные задачи

контроллер:

@PutMapping("/api/task/{username}")
    public ResponseEntity updateTasks(@Valid @RequestBody List<Task> tasks, @PathVariable String username) {
        try {
            Account accountToBeUpdated = accountService.findByUsername(username);
            accountToBeUpdated.setTasks(tasks);
            accountService.update(accountToBeUpdated);
            return new ResponseEntity("tasks updated successfully", new HttpHeaders(), HttpStatus.OK);
        } catch (IndexOutOfBoundsException e) {
            e.printStackTrace();
            return new ResponseEntity("username do not exist", new HttpHeaders(), HttpStatus.BAD_REQUEST);
        }
    }

постоянный абстрактный спящий режим:

package com.yoav.todolist.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

/**
 * this class is simply but implementation of hibernate CRUD operations
 * **/
public abstract class AbstractHibernateDAO<T> {

    private Class<T> ourClass;

    /**
     * @implNote all the extends class that inherent this abstract class should set the class in the constructor
     * @see AccountMysqlImpl for example
     * **/
    public void setOurClass(Class<T> ourClass) {
        this.ourClass = ourClass;
    }

    @Autowired
    private SessionFactory sessionFactory;

    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    public T getById(int id) {
        return (T) sessionFactory.getCurrentSession().get(ourClass, id);
    }

    public List<T> getAll() {
        return sessionFactory.getCurrentSession().createQuery("from " + ourClass.getName()).list();
    }

    public void save(T t) {
        sessionFactory.getCurrentSession().persist(t);
    }

    public T update(T t) {
        return (T) sessionFactory.getCurrentSession().merge(t);
    }

    public void delete(T t) {
        sessionFactory.getCurrentSession().delete(t);
    }

    public void deleteById(int id) {
        final T t = getById(id);
        delete(t);
        sessionFactory.getCurrentSession().flush();
    }
}

сущность учетной записи:

package com.yoav.todolist.models;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Table(name = "accounts")
public class Account {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private int id;

    @Column(name = "username")
    private String username;

    @Column(name = "password")
    private String password;

    @OneToMany(mappedBy = "account", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<Task> tasks = new ArrayList<>();

    public Account(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public Account() {
    }

    public void removeTask(Task task) {
        task.setAccount(null);
        tasks.remove(task);
    }

    public void addTask(Task task) {
        task.setAccount(this);
        tasks.add(task);
    }

    public List<Task> getTasks() {
        return tasks;
    }

    public void setTasks(List<Task> tasks) {
        tasks.forEach(i -> i.setAccount(this));
        this.tasks = tasks;
    }

    public int getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public boolean equals(Object account) {
        return ((Account)account).getUsername().equals(this.username);
    }

    @Override
    public String toString() {
        return "Account{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

объект задачи:

package com.yoav.todolist.models;

import com.fasterxml.jackson.annotation.JsonIgnore;

import javax.persistence.*;
import java.util.Date;

@Entity
@Table(name = "tasks")
public class Task {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private int id;

    @Column(name = "task")
    private String task;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="account_id", nullable=false)
    @JsonIgnore
    private Account account;

    @Temporal(TemporalType.DATE)
    @Column(name = "date_of_creation_task")
    private Date date;

    public Task(String task) {
        this.date = new Date();
        this.task = task;
    }

    public Task() {
        this.date = new Date();
    }

    public Account getAccount() {
        return account;
    }

    public void setAccount(Account account) {
        this.account = account;
    }

    public int getId() {
        return id;
    }

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

    public String getTask() {
        return task;
    }

    public void setTask(String task) {
        this.task = task;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    @Override
    public boolean equals(Object task) {
        return ((Task)task).getId() == this.id;
    }

    @Override
    public String toString() {
        return "Task{" +
                "id=" + id +
                ", task='" + task + '\'' +
                '}';
    }
}

У меня также есть сервис, репозиторий и интерфейс DAO для этих объектов, но они не так важны, поскольку представляют собой стандартный код, повторяющий метод обновления ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...