我有一个Admin
类,可以通过cooks
从数据库中删除id
。当我使用void deleteByUserRoleAndId(String role, Long id)
方法时;它从数据库中删除了所有列,但只需要一个,并且还清除了与此表关联的所有交叉表!我可能是什么问题?
烹饪:
public class Cook {
public Cook() { // Пустой конструктор для Hibernate
}
// Поля
// name, lastName, login, password берем от класса User через связи;
private @Id
@GeneratedValue
Long id;
@Enumerated(EnumType.STRING)
@Column(name = "type")
private CookType cookType;
@Column(name = "rating")
private float rating;
@Column(name = "cook_status")
private boolean cookStatus;
@Column(name = "about_cook")
private String aboutCook;
//Relationships
//
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id", referencedColumnName = "id") // Join without Cook in User class
private User user;
// Лист отзывов
@OneToMany(mappedBy = "cook", cascade = CascadeType.ALL)
@JsonIgnore // Таким образом я предотвратил рекурсию
private List<Review> reviewList;
// Лист поваров
@OneToMany(mappedBy = "cook", cascade = CascadeType.ALL)
@JsonIgnore // Таким образом я предотвратил рекурсию
private List<Order> orderList;
// Лист блюд
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(
name = "cook_dish",
joinColumns = @JoinColumn(name = "dish_id"),
inverseJoinColumns = @JoinColumn(name = "cook_id"))
@JsonIgnore // Таким образом я предотвратил рекурсию
private List<Dish> dish;
}
JpaRepo:
public interface CookRepository extends JpaRepository<Cook, Long> { // Интерфейс для репозитория Cook
// Удалить Повара Role + ID
void deleteByUserRoleAndId(String role, Long id);
AdminService:
@Transactional
public void deleteCook(Long id) {
cookRepository.deleteByUserRoleAndId("COOK", id);
}
AdminController:
@DeleteMapping("/delete/cook/{id}")
void removeCook(@PathVariable Long id) {
adminService.deleteCook(id);
}
当我使用脚本运行应用程序时,会将数据添加到所有表中,然后在执行此方法时将其清除!
我正在使用下载REST
+ Spring boot
+ Spring MVC
+ Spring Security
+ hibernate
+来编写应用程序的Jpa
+ PostgreSQL
答案 0 :(得分:0)
您有一个类和一个名为“ Cook”的数据库表,该表具有唯一的ID。您想要删除一个由该ID标识的特定厨师-例如,您要删除ID为123的厨师。
在任何地方都没有“ UserRole”。您不需要角色-您已经知道您正在处理Cook表。实际上,“ Cook”类甚至没有“ UserRole”属性。
因此spring会尽力解释deleteByUserRoleAndId
。在没有“ userRole”属性的情况下,它可能会尝试将函数名称中的“ User”与确实存在的“ User”属性进行匹配(为了比较,https://docs.spring.io/spring-data/data-commons/docs/1.6.1.RELEASE/reference/html/repositories.html说findByAddressZipCode(ZipCode zipCode);
将遍历address
属性中)。之后我只能猜测会发生什么。
无论如何,解决方案很简单。由于Cook
没有UserRole
,因此方法名称中没有UserRole。
所以方法签名者很简单:
void deleteById(Long id);
服务是:
@Transactional
public void deleteCook(Long id) {
cookRepository.deleteById(id);
}
答案 1 :(得分:0)
在模型类中,我删除cascade = CascadeType.All
并添加cascade = CascadeType.PERSIST
。然后在Dish
班上我也做了同样的事情。
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
@JoinTable(
name = "cook_dish",
joinColumns = @JoinColumn(name = "dish_id"),
inverseJoinColumns = @JoinColumn(name = "cook_id"))
@JsonIgnore
private List<Dish> dish;