Java @OneToMany关系中Spring Boot中的子实体软删除问题
我最近开始学习Spring Boot。 我正在尝试软删除用户。我想在软删除用户时软删除该用户的所有注释。但我的代码只是软删除用户,而不是删除其注释。 当我只在notes表上执行软删除时,它工作正常,但在用户实体上,它只删除用户 注释 使用者Java @OneToMany关系中Spring Boot中的子实体软删除问题,java,spring-boot,hibernate,jpa,Java,Spring Boot,Hibernate,Jpa,我最近开始学习Spring Boot。 我正在尝试软删除用户。我想在软删除用户时软删除该用户的所有注释。但我的代码只是软删除用户,而不是删除其注释。 当我只在notes表上执行软删除时,它工作正常,但在用户实体上,它只删除用户 注释 使用者 package com.we.springmvcboot.Model; 导入java.util.ArrayList; 导入java.util.Set; 导入javax.persistence.CascadeType; 导入javax.persistence.
package com.we.springmvcboot.Model;
导入java.util.ArrayList;
导入java.util.Set;
导入javax.persistence.CascadeType;
导入javax.persistence.Column;
导入javax.persistence.Entity;
导入javax.persistence.FetchType;
导入javax.persistence.GeneratedValue;
导入javax.persistence.GenerationType;
导入javax.persistence.Id;
导入javax.persistence.OneToMany;
导入javax.persistence.Table;
导入org.hibernate.annotations.Where;
导入antlr.collections.List;
@实体
@表(name=“User”)
@其中(clause=“deleted='false'”//false
公共类用户{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私有长用户ID;
@列(name=“emailid”)
私有字符串emailID;
@列(name=“已删除”)
私有字符串deleted=“false”;
@OneToMany(mappedBy=“user”,fetch=FetchType.EAGER,cascade=CascadeType.ALL,orphan=true)
私人设置用户注释;
公共用户(){}
公共用户(字符串emailID){
超级();
this.emailID=emailID;
}
公共长getUserID(){
返回用户标识;
}
public void setUserID(长userID){
UserID=UserID;
}
公共字符串getemailID(){
返回emailID;
}
public void setemailID(字符串emailID){
emailID=emailID;
}
公共集getUsernotes(){
返回用户注释;
}
公共void setUsernotes(Set usernotes){
this.usernotes=usernotes;
}
}
便笺
package com.we.springmvcboot.Repository;
import java.sql.Date;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import com.we.springmvcboot.Model.Notes;
@Repository
public interface NotesRepository extends JpaRepository<Notes, Long> {
@Query("update Notes e set e.deleted='true' where e.NotesID=?1")
@Transactional
@Modifying
public void softDelete(long id);
}
package com.we.springmvcboot.Repository;
import java.sql.Date;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import com.we.springmvcboot.Model.Notes;
import com.we.springmvcboot.Model.User;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByEmailID(String email);
@Query("update User e set e.deleted='true', where e.UserID=?1")
@Transactional
@Modifying
public void softDelete(long id);
}
package com.we.springmvcboot.Repository;
导入java.sql.Date;
导入java.util.List;
导入javax.transaction.Transactional;
导入org.springframework.data.jpa.repository.JpaRepository;
导入org.springframework.data.jpa.repository.Modifying;
导入org.springframework.data.jpa.repository.Query;
导入org.springframework.stereotype.Repository;
导入com.we.springmvcboot.Model.Notes;
@存储库
公共接口NotesRepository扩展了JpaRepository{
@查询(“updatenotes e set e.deleted='true',其中e.NotesID=?1”)
@交易的
@修改
公共无效软删除(长id);
}
用户存储库
package com.we.springmvcboot.Repository;
import java.sql.Date;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import com.we.springmvcboot.Model.Notes;
@Repository
public interface NotesRepository extends JpaRepository<Notes, Long> {
@Query("update Notes e set e.deleted='true' where e.NotesID=?1")
@Transactional
@Modifying
public void softDelete(long id);
}
package com.we.springmvcboot.Repository;
import java.sql.Date;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import com.we.springmvcboot.Model.Notes;
import com.we.springmvcboot.Model.User;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByEmailID(String email);
@Query("update User e set e.deleted='true', where e.UserID=?1")
@Transactional
@Modifying
public void softDelete(long id);
}
package com.we.springmvcboot.Repository;
导入java.sql.Date;
导入java.util.List;
导入javax.transaction.Transactional;
导入org.springframework.data.jpa.repository.JpaRepository;
导入org.springframework.data.jpa.repository.Modifying;
导入org.springframework.data.jpa.repository.Query;
导入org.springframework.stereotype.Repository;
导入com.we.springmvcboot.Model.Notes;
导入com.we.springmvcboot.Model.User;
@存储库
公共接口用户存储库扩展了JpaRepository{
列出findByEmailID(字符串电子邮件);
@查询(“更新用户e set e.deleted='true',其中e.UserID=?1”)
@交易的
@修改
公共无效软删除(长id);
}
TodoService
package com.we.springmvcboot.Service;
import com.we.springmvcboot.Model.*;
import com.we.springmvcboot.exception.*;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import com.we.springmvcboot.Repository.NotesRepository;
import com.we.springmvcboot.Repository.UserRepository;
@Service
public class TodoService {
@Autowired
UserRepository userrepo;
@Autowired
NotesRepository notesrepo;
public Object deleteUser(Map<String, Object> input) {
long userID;
userID = ((Number) input.get("userID")).longValue();
userrepo.softDelete(userID);
return null;
}
}
package com.we.springmvcboot.Service;
导入com.we.springmvcboot.Model.*;
导入com.we.springmvcboot.exception.*;
导入java.text.simpleDataFormat;
导入java.time.LocalDate;
导入java.util.ArrayList;
导入java.util.Date;
导入java.util.HashMap;
导入java.util.List;
导入java.util.Map;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.stereotype.Service;
导入org.springframework.web.bind.annotation.RequestBody;
导入com.we.springmvcboot.Repository.NotesRepository;
导入com.we.springmvcboot.Repository.UserRepository;
@服务
公共类TodoService{
@自动连线
userrepo;
@自动连线
附注储蓄性附注;
公共对象删除用户(映射输入){
长用户标识;
userID=((Number)input.get(“userID”)).longValue();
userrepo.softDelete(userID);
返回null;
}
}
我建议您阅读最简单的软删除方法。你应该得出如下结论:
@SQLDelete("UPDATE User SET deleted = TRUE WHERE id = ?")
@Where(clause = "deleted = FALSE")
public class User {
@OneToMany(mappedBy = "user", fetch = EAGER, cascade=ALL, orphanRemoval = true)
private Set<Notes> usernotes;
...
}
@SQLDelete("UPDATE Note SET deleted = TRUE WHERE id = ?")
@Where(clause = "deleted = FALSE")
public class Note {...}
但是,如果您想继续使用自定义查询,您仍然需要调用一个单独的查询来通过userId
删除Note
s,因为在这种情况下不会触发Cascade.REMOVE
。换句话说,您将需要一种类似以下的方法:
public interface NotesRepository extends JpaRepository<Notes, Long> {
@Query("UPDATE Notes n SET n.deleted = TRUE WHERE n.user.id = :id")
public void deleteByUserId(long id);
}
我不太明白。您明确定义了调用
UserRepository.softDelete
时要执行的查询。您的查询甚至不涉及Notes
表。Spring数据是如何自动知道你在做什么的?@crizzis请建议在这种情况下应该怎么做。我不熟悉弹簧靴
public interface NotesRepository extends JpaRepository<Notes, Long> {
@Query("UPDATE Notes n SET n.deleted = TRUE WHERE n.user.id = :id")
public void deleteByUserId(long id);
}
long userID;
userID = ((Number) input.get("userID")).longValue();
userrepo.softDelete(userID);
noteRepo.deleteByUserId(userID);
return null;