Я пытаюсь построить 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 для этих объектов, но они не так важны, поскольку представляют собой стандартный код, повторяющий метод обновления ...