Java 如何删除多对多关系(Spring jpa rest app)中的子实体而不删除父实体?
我在专家和标签之间有一种多对多的关系。我想允许用户删除专家包含的一个标记,而不删除整个专家实体。现在我总是删除一个tagIi get all expert也删除了 我的spring jpa应用程序控件按id删除标记的方法: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
@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
的属性