【发布时间】: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