【问题标题】:When removing a child from list, it deletes the parent as well从列表中删除子项时,它也会删除父项
【发布时间】:2019-08-23 08:15:05
【问题描述】:

我有两个类用户和任务。当我从列表中删除一个孩子时,我只想删除那个孩子,而不是它也会删除父母。我想保留父级(用户),但想从列表中删除一个子级(任务列表)。

用户等级:

@Entity
@AllArgsConstructor
@Getter
@Setter
@NoArgsConstructor
@Table(name = "users",
        uniqueConstraints = {
                @UniqueConstraint(name = "unq_email_users", columnNames = "email")
        })
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "first_name", nullable = false)
    private String firstName;

    @Column(name = "last_name")
    private String lastName;

    @Column(name = "email", nullable = false)
    private String email;

    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "user_id", foreignKey = @ForeignKey(name = "FK_users"))
    private List<Task> tasks = new ArrayList<>();

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", firstName='" + firstName + '\'' +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

任务类:

@Entity
@Table(name = "tasks")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Task {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "title")
    private String title;

    @Column(name = "description")
    private String description;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JsonIgnore
    private User user;

    @Override
    public String toString() {
        return "Task{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", description='" + description + '\'' +
                '}';
    }
}

这是我用来从列表中删除子项的服务方法:

public User removeUserTask(Long userId, Long taskId) {
        Optional<User> userOptional = userRepository.findById(userId);
        if(!userOptional.isPresent()) {
            throw new NotFoundException("No User Found With Id - " + userId);
        }

        User user = userOptional.get();
        Task task1 = user.getTasks().stream().filter(task -> task.getId().equals(userId)).findFirst().orElse(null);
        if(task1==null) {
            throw new NotFoundException("No Task Found With Id - " + taskId);
        }
        user.getTasks().remove(task1);
        userRepository.save(user);
        return user;
    }

但令人惊讶的是它也删除了父级。

我想要做的只是从其表中删除任务,但是当我删除一个任务时,它也会删除父任务和其他任务。 orphanRemoval = true 不应该只删除那些与用户无关的任务。

【问题讨论】:

    标签: java mysql spring spring-boot spring-data


    【解决方案1】:

    这是因为您告诉 hibernate 使用 cascade = CascadeType.ALL 级联更改。如果不想删除 parent,则需要将其删除或提供CascageTypes 而非CascadeType.REMOVE 的数组,例如:

    @ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
    })
    

    【讨论】:

      【解决方案2】:

      我已经弄清楚了,我在两个实体中都使用了cascade = CascadeType.ALL,所以删除 Task 会自动删除 User,我已经改变了

      cascade = CascadType.All
      

      @ManyToOne(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, fetch = FetchType.LAZY)
      

      在任务实体上,它工作正常。

      【讨论】:

      • 这不是重复,实际上我们同时评论了
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-18
      • 2022-12-20
      • 2016-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      相关资源
      最近更新 更多