簡體   English   中英

JpaRepository 中的 delete 方法從 DB 表中刪除所有行

[英]The delete method from JpaRepository deletes all rows from the DB table

我有一個Admin class 可以通過id從數據庫中刪除cooks 當我使用 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);

管理服務:

@Transactional
    public void deleteCook(Long id) {

        cookRepository.deleteByUserRoleAndId("COOK", id);

    }

管理員控制器:

@DeleteMapping("/delete/cook/{id}")
    void removeCook(@PathVariable Long id) {
        adminService.deleteCook(id);
    }

當我使用腳本運行應用程序時,數據被添加到所有表中,然后當執行此方法時,它被清除了!

在此處輸入圖像描述

在此處輸入圖像描述

I'm writing the REST of the app, using the download Spring boot + Spring MVC + Spring Security + hibernate + Jpa + PostgreSQL

你有一個 class 和一個名為“Cook”的數據庫表,它有一個唯一的 Id。 您想刪除一個您通過該 ID 標識的特定廚師 - 例如,您想刪除 ID 為 123 的廚師。

那里沒有“用戶角色”。 你不需要這個角色 - 你已經知道你正在處理 Cook 表。 事實上,class“Cook”甚至沒有“UserRole”屬性。

所以 spring 試圖盡可能地解釋deleteByUserRoleAndId 在沒有“userRole”屬性的情況下,它可能會嘗試將您的 function 名稱中的“用戶”與確實存在的“用戶”屬性進行匹配(為了比較, https://docs.Z2A2D595E2BED9A0B234F027. 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);

}

在 model class 我刪除cascade = CascadeType.All並添加cascade = CascadeType.PERSIST 然后在 class 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;

我遇到了同樣的問題。 我的錯誤在 application.properties 文件中。

spring.jpa.hibernate.ddl-auto =創建刪除

我應該使用 update 或 validate 而不是 create-drop

請參閱spring.jpa.hibernate.ddl-auto 屬性在 Z38008DD81C28F4DD7 中究竟如何工作?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM