Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @OneToMany关系中Spring Boot中的子实体软删除问题_Java_Spring Boot_Hibernate_Jpa - Fatal编程技术网

Java @OneToMany关系中Spring Boot中的子实体软删除问题

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.

我最近开始学习Spring Boot。 我正在尝试软删除用户。我想在软删除用户时软删除该用户的所有注释。但我的代码只是软删除用户,而不是删除其注释。 当我只在notes表上执行软删除时,它工作正常,但在用户实体上,它只删除用户

注释

使用者

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;