Spring JPA -删除所有子实体而不是一个

snvhrwxg  于 2023-01-13  发布在  Spring
关注(0)|答案(1)|浏览(165)

我有一个Spring Boot应用程序,使用Spring JPA在父/子,一对多数据库关系上执行操作。我已经执行保存和获取请求没有问题有一段时间了,但是我现在需要从子数据库表中删除子实体,但是当我测试我的代码时,我发现它从DB和父实体中删除了所有子实体,这不是我正在寻找的行为。
下面是实体类,Zoo是父类,Animal是子类。它们应该有一对多关系。
父实体。

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

import com.fasterxml.jackson.annotation.JsonManagedReference;

@Entity
@Table(name = "ZOOS")
public class Zoo {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, unique = true)
    private Integer id;
    
    @ManyToOne
    @JoinColumn(name="name")
    private String name;
    
    @OneToMany(mappedBy = "zoo", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    @JsonManagedReference
    private List<Animal> animal;

    public Integer getId() {
        return id;
    }

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

    public List<Animal> getAnimal() {
        return animal;
    }

    public void setAnimal(List<Animal> animal) {
        this.animal = animal;
    }
    
}

子实体

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import com.fasterxml.jackson.annotation.JsonBackReference;

@Entity
@Table(name = "ANIMALS")
public class Animal {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, unique = true)
    private Integer id;
    
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "zooId")
    @JsonBackReference
    private Zoo zoo;
    
    @Column(name = "species", nullable = false)
    private String species;

    public Integer getId() {
        return id;
    }

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

    public Zoo getZoo() {
        return zoo;
    }

    public void setZoo(Zoo zoo) {
        this.zoo = zoo;
    }

    public String getSpecies() {
        return species;
    }

    public void setSpecies(String species) {
        this.species = species;
    }

}

Animal(子)实体的存储库

import org.springframework.data.jpa.repository.JpaRepository;

import uk.co.example.api.entities.Animal;

public interface AnimalRepository extends JpaRepository<Animal, Integer> {

}

被调用来删除动物实体的java方法

@Autowired
    AnimalRepository animalRepo;
    
    public void deleteAnimal(Integer animalId) {
        animalRepo.deleteById(animalId);
    }

该方法应该从Animal db表中删除一只动物,但实际上它是从Zoo db表中删除具有相同zooId和zoo的所有动物。
我已经研究过并尝试过将Animal实体类中ManyToOne注解上的CascadeType. ALL更改为PERSIST,我也尝试过完全删除级联参数,在这两种情况下,我发现我的应用程序中不会出现错误,但根本不会删除任何动物记录。表将处于与方法运行前相同的状态。
我也尝试过在Zoo实体类的OneToMany注解上使用'orphanRemoval = true',但是在测试时似乎没有任何影响。

@OneToMany(mappedBy = "zoo", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
    @Fetch(value = FetchMode.SUBSELECT)
    @JsonManagedReference
    private List<Animal> animal;

任何帮助都将不胜感激。

qojgxg4l

qojgxg4l1#

从动物到动物园的关系是错误的

@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "zooId")
@JsonBackReference
private Zoo zoo;

使用Cascatetype.ALL如果你同时删除了一个动物,那么这个动物园也会被删除,并且这会导致删除所有的动物。
您应该删除级联,因为它在大多数情况下没有意义

相关问题