JpaRepository中的delete方法从数据库表中删除所有行

时间:2020-05-18 17:30:41

标签: java postgresql hibernate spring-mvc jpa

我有一个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);
    }

当我使用脚本运行应用程序时,会将数据添加到所有表中,然后在执行此方法时将其清除!

enter image description here

enter image description here

我正在使用下载REST + Spring boot + Spring MVC + Spring Security + hibernate +来编写应用程序的Jpa + PostgreSQL

2 个答案:

答案 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.htmlfindByAddressZipCode(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;