Java 如何删除多对多关系(Spring jpa rest app)中的子实体而不删除父实体?

Java 如何删除多对多关系(Spring jpa rest app)中的子实体而不删除父实体?,java,spring,hibernate,rest,Java,Spring,Hibernate,Rest,我在专家和标签之间有一种多对多的关系。我想允许用户删除专家包含的一个标记,而不删除整个专家实体。现在我总是删除一个tagIi get all expert也删除了 我的spring jpa应用程序控件按id删除标记的方法: @DeleteMapping("/tags/{id}") public ResponseEntity<Void> deleteTagById(@PathVariable Long id){ log.debug(&quo

我在专家和标签之间有一种多对多的关系。我想允许用户删除专家包含的一个标记,而不删除整个专家实体。现在我总是删除一个tagIi get all expert也删除了

我的spring jpa应用程序控件按id删除标记的方法:

 @DeleteMapping("/tags/{id}")
    public ResponseEntity<Void> deleteTagById(@PathVariable Long id){
        log.debug("REST request to delete a tag by Id{} ", id);
        return tagService.deleteById(id);
    }
@Entity
@Table(name="tags")
public class Tag {

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

    @ManyToMany(mappedBy="tags", cascade = {CascadeType.ALL})
    private List<Expert> experts = new ArrayList<>();

    public Tag() {
    } //getters and setters
@Entity
@Table(name="experts")
public class Expert {

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

    private String name;
    private String surname;
    private String dni;
    private String address;
    private String mail;
    private String phone;
    private String linkedln;
    private String state;
    private String rating;
    private String availability;
    
    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    @JoinTable(
            name = "experts_tags",
            joinColumns = {@JoinColumn(name="tags_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name="experts_id", referencedColumnName = "id")}
    )
    private List<Tag> tags = new ArrayList<>();


    public Expert() {
    } //getters and setters
@DeleteMapping(“/tags/{id}”)
公共响应性deleteTagById(@PathVariable Long id){
debug(“按Id{},Id删除标记的REST请求);
return tagService.deleteById(id);
}
我的标签型号:

 @DeleteMapping("/tags/{id}")
    public ResponseEntity<Void> deleteTagById(@PathVariable Long id){
        log.debug("REST request to delete a tag by Id{} ", id);
        return tagService.deleteById(id);
    }
@Entity
@Table(name="tags")
public class Tag {

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

    @ManyToMany(mappedBy="tags", cascade = {CascadeType.ALL})
    private List<Expert> experts = new ArrayList<>();

    public Tag() {
    } //getters and setters
@Entity
@Table(name="experts")
public class Expert {

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

    private String name;
    private String surname;
    private String dni;
    private String address;
    private String mail;
    private String phone;
    private String linkedln;
    private String state;
    private String rating;
    private String availability;
    
    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    @JoinTable(
            name = "experts_tags",
            joinColumns = {@JoinColumn(name="tags_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name="experts_id", referencedColumnName = "id")}
    )
    private List<Tag> tags = new ArrayList<>();


    public Expert() {
    } //getters and setters
@实体
@表(name=“tags”)
公共类标签{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名称;
@ManyToMany(mappedBy=“tags”,cascade={CascadeType.ALL})
私有列表专家=新的ArrayList();
公共标签(){
}//getter和setter
我的专家模型:

 @DeleteMapping("/tags/{id}")
    public ResponseEntity<Void> deleteTagById(@PathVariable Long id){
        log.debug("REST request to delete a tag by Id{} ", id);
        return tagService.deleteById(id);
    }
@Entity
@Table(name="tags")
public class Tag {

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

    @ManyToMany(mappedBy="tags", cascade = {CascadeType.ALL})
    private List<Expert> experts = new ArrayList<>();

    public Tag() {
    } //getters and setters
@Entity
@Table(name="experts")
public class Expert {

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

    private String name;
    private String surname;
    private String dni;
    private String address;
    private String mail;
    private String phone;
    private String linkedln;
    private String state;
    private String rating;
    private String availability;
    
    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    @JoinTable(
            name = "experts_tags",
            joinColumns = {@JoinColumn(name="tags_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name="experts_id", referencedColumnName = "id")}
    )
    private List<Tag> tags = new ArrayList<>();


    public Expert() {
    } //getters and setters
@实体
@表(name=“专家”)
公开课专家{
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
私人长id;
私有字符串名称;
私家姓;
私有字符串dni;
私有字符串地址;
私人字符串邮件;
私人电话;
私有字符串链接;
私有字符串状态;
私人字符串评级;
私有字符串可用性;
@ManyToMany(fetch=FetchType.EAGER,cascade={CascadeType.ALL})
@可接合(
name=“专家标签”,
joinColumns={@JoinColumn(name=“tags\u id”,referencedColumnName=“id”)},
inverseJoinColumns={@JoinColumn(name=“experts\u id”,referencedColumnName=“id”)}
)
private List tags=new ArrayList();
公共专家(){
}//getter和setter
到目前为止我尝试了什么:

 @DeleteMapping("/tags/{id}")
    public ResponseEntity<Void> deleteTagById(@PathVariable Long id){
        log.debug("REST request to delete a tag by Id{} ", id);
        return tagService.deleteById(id);
    }
@Entity
@Table(name="tags")
public class Tag {

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

    @ManyToMany(mappedBy="tags", cascade = {CascadeType.ALL})
    private List<Expert> experts = new ArrayList<>();

    public Tag() {
    } //getters and setters
@Entity
@Table(name="experts")
public class Expert {

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

    private String name;
    private String surname;
    private String dni;
    private String address;
    private String mail;
    private String phone;
    private String linkedln;
    private String state;
    private String rating;
    private String availability;
    
    @ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
    @JoinTable(
            name = "experts_tags",
            joinColumns = {@JoinColumn(name="tags_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name="experts_id", referencedColumnName = "id")}
    )
    private List<Tag> tags = new ArrayList<>();


    public Expert() {
    } //getters and setters
此方法有效地删除了标签,但也删除了专家:

public ResponseEntity<Void> deleteTag(Long id) {
        Tag tag=this.manager.find(Tag.class,id);
        this.manager.remove(tag);
        return ResponseEntity.noContent().build();
public ResponseEntity deleteTag(长id){
Tag Tag=this.manager.find(Tag.class,id);
此.manager.remove(标记);
返回ResponseEntity.noContent().build();
我试图避免此方法返回500错误:

public ResponseEntity<Void> deleteTagById(Long id) {
        Expert expert = (Expert) manager.createQuery("SELECT  Expert from Tag u where u.id = :id");

        for(Tag tag : expert.getTags()){
            if (tag.getId() == id){
                expert.getTags().remove(tag);
                manager.persist(expert);
            }
        }
        return ResponseEntity.noContent().build();

    }
}

    }
public ResponseEntity deleteTagById(长id){
Expert=(Expert)manager.createQuery(“从标记u中选择专家,其中u.id=:id”);
for(标记:expert.getTags()){
if(tag.getId()==id){
expert.getTags().remove(标记);
经理。坚持(专家);
}
}
返回ResponseEntity.noContent().build();
}
}
}

有人能帮我吗?我很感激任何建议:)谢谢!

这是因为你定义所有的行动都应该传达给专家:

@ManyToMany(mappedBy="tags", cascade = {CascadeType.ALL})
private List<Expert> experts = new ArrayList<>();
@ManyToMany(mappedBy=“tags”,cascade={CascadeType.ALL})
私有列表专家=新的ArrayList();

不要使用
ALL
,而应该列出实际要级联的内容。

标记中没有名为
Expert
的属性