我有一个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;
任何帮助都将不胜感激。
1条答案
按热度按时间qojgxg4l1#
从动物到动物园的关系是错误的
使用Cascatetype.ALL如果你同时删除了一个动物,那么这个动物园也会被删除,并且这会导致删除所有的动物。
您应该删除级联,因为它在大多数情况下没有意义