【问题标题】:Spring data jpa - While Updating a parent, how to delete the childs associated with it (based on id) from database and add the new childSpring data jpa - 在更新父级时,如何从数据库中删除与其关联的子级(基于 id)并添加新的子级
【发布时间】:2017-10-18 07:18:14
【问题描述】:

我有父实体 Head 和关联的子实体是使用 onetomany 映射的 Detail 和 Comment。我只有一个 DAO,即 HeadDao。项目编号 PK 在 Head 和 FK 在 Detail 和 Comment。我试图弄清楚如何使用 projectNumber 删除子评论而不为孩子编写 DAO。

场景是,在更新 Head 时,我想首先从数据库中删除现有的(关联的)评论(使用 projectNumber),然后添加请求中的新 cmets。任何人都可以帮我解决这个问题。 下面是实体类(仅供参考,评论类有复合 id,但我没有在这里粘贴)

@Entity(name = "Head")
@Table(name = "HEAD")
public class Head {
@Id
@Column(name = "PRJ_NBR")
private Integer projNumber;
@JsonIgnore
@OneToMany(mappedBy = "head",cascade = CascadeType.ALL,orphanRemoval = 
true,fetch = FetchType.LAZY)
private List<Detail> detailsList = new ArrayList<Detail>();

@JsonIgnore
@OneToMany(mappedBy = "head",cascade = CascadeType.ALL,orphanRemoval = 
true,fetch = FetchType.LAZY)
private List<Comment> commentsList = new ArrayList<Comment>();
}

@Entity
@Table(name = "PRJ_CMT")
@JsonIgnoreProperties
public class Comment {
@Transient
private Integer projectNumber;

@JsonIgnore
@EmbeddedId
private CommentCompositeId id;

@JsonIgnore
@ManyToOne
@JoinColumn(name = "PRJ_NBR", updatable=false, insertable=false)
private Head head;
}

@Transactional
@Repository
@PersistenceContext(type = PersistenceContextType.EXTENDED)
public abstract interface HeadDao  extends JpaRepository<Head, 
Serializable>
{
 public abstract List<Head> findByProjNumber(Integer paramInteger);

 public abstract List<Head> findAll();

  @SuppressWarnings("unchecked")
  public abstract Head saveAndFlush(Head paramHead);

  public abstract List<Head> findByCusSysId(Integer paramInteger);

  public abstract Integer deleteByProjNumber(Integer projNumber);
 }

 While adding i'm using below code
this.headDao.saveAndFlush(head);

【问题讨论】:

    标签: java spring hibernate jpa spring-data-jpa


    【解决方案1】:

    通过将 cascade = CascadeType.PERSIST 添加到 ManytoOne(注释)端来解决问题(级联都应该出现在 onetomany - 头上)。 现在,当我添加 cmets 列表时,它会删除当前列表中不存在的 cmets(用于项目编号)并更新其他 cmets

    【讨论】:

      【解决方案2】:

      只需将commentsList 替换为现有的head 怎么样?

      head.commentsList 创建设置器。

      将 cmets 替换为填充了新 cmets 的 newComments = new ArrayList&lt;Comment&gt;(),然后是 head.setCommentsList(newComments)

      坚持头,this.headDao.saveAndFlush(head);

      【讨论】:

      • 试过了,这只会将新列表添加到数据库中,不会删除现有列表。仅供参考:我最初没有做 fetch 。我只是将作为 API 请求的 head 对象并调用更新 dao
      • 我理解正确吗:在更新评论列表之前,您没有从 db 获取对应的头部?但是用新的 cmets 存储外部的东西作为请求响应?
      • 是的,您理解正确,感谢您之前的评论(我认为您已将其删除)。我尝试在 cmets 端添加所有级联,但它给出了错误,例如 _object 引用了未保存的瞬态实例 _。他们我尝试了 PERSIST,它起作用了。通过在评论端添加 (cascade = CascadeType.PERSIST) 解决了这个问题
      • 删除它是不理智的 :) 你需要通过我认为从请求中获得的 id 来获取头部。然后用 cmets 更新获取的头部。我不确定这是否有帮助,但仍然是正确的方法
      • 您能否编辑添加 PERSIST 的答案!这样我就可以接受答案了?
      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 2019-03-14
      • 2013-02-19
      • 2014-09-02
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多