当前位置: 首页 > 知识库问答 >
问题:

Hibernate JPA:@OneTomany删除旧的,插入新的而不刷新

孙朝明
2023-03-14
@OneToMany(cascade = {CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE }, orphanRemoval = true)
@JoinColumn(name = "entity_id", insertable = true, updatable = true, nullable = false)
private List<Child> children;

现在我想在一个事务内执行以下操作:

  • 获取父实体
  • 遍历子级列表
  • 删除其中一个子项
  • 插入新子级

所以,基本上我只是完全替换了其中一个孩子。

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteAndAdd(Long parentId, Long childId) {
  Parent parent = entityManager.find(parentId);
  for (Iterator it = parent.children.iterator(); it.hasNext();) {
    Child child = it.next();
    if (child.id == childId) {
      it.remove();
    }
  }
  Child newChild = new Child();
  parent.children.add(newChild);
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteAndAdd(Long parentId, Long childId) {
  Parent parent = entityManager.find(parentId);
  for (Iterator it = parent.children.iterator(); it.hasNext();) {
    Child child = it.next();
    if (child.id == childId) {
      it.remove();
    }
  }
  entityManager.flush();
  Child newChild = new Child();
  parent.children.add(newChild);
}

由于我不想让hibernate混淆了发送到DB的语句的顺序,所以我对hibernate肯定有其他的假设,但情况并非如此。你知道为什么后一个例子有效,而第一个却不行吗?

Hibernate版本为3.5。是Mysql InnoDB

共有1个答案

羊舌炯
2023-03-14

Hibernate不知道也不尊重所有的数据库约束(例如MySQL唯一约束)。这是一个已知的问题,他们不打算在短期内解决。

Hibernate有一个定义的顺序,用于在刷新过程中发生操作的方式。

实体删除总是在插入之后发生。我所知道的唯一答案是移除约束或添加额外的同花顺。

 类似资料:
  • 问题内容: 我实际上从未完全了解hibernate状态下的这种行为。我在名为“ Parent”的实体中使用@OneToMany关系,其注释如下: 现在,我想在一个事务中执行以下操作: 获取父实体 遍历孩子们的名单 删除其中一个孩子 插入一个新孩子 因此,基本上我只是完全替换其中一个孩子。 据我了解的这个问题,我应该能够做这样的事情:(请注意,这只是一些Java伪代码来说明问题) 但是,如果新的Ch

  • 问题内容: 我想用Java编写一个文件而不清除(删除)该文件上的旧数据! 我运行此代码,发现每次运行后,.txt文件上的所有较旧数据都被清除了! 我的代码在这里: 问题答案: 使用可以指示在附加模式下打开文件的构造函数:

  • 插入、更新和删除语句基于以开头的层次结构生成 UpdateBase . 这个 Insert 和 Update 构建基于中介的 ValuesBase . DML基础构造函数 顶级的“插入”、“更新”、“删除”构造函数。 Object Name Description delete(table[, whereclause, bind, returning, ...], **dialect_kw) 构建

  • 注意:如果我只有一个孩子,我可以删除它,没有任何例外,如果我有2个或更多的孩子,我有一个例外。 谢谢你的帮助!

  • 我使用下面的log4j2。xml 我想要的是旧的日志文件被删除,如果累积的大小超过。但是log4j2首先删除最近修改的文件。https://logging.apache.org/log4j/2.x/manual/appenders.html说有一个路径排序参数可以做到这一点。有人能告诉我如何指定相反的将逻辑排序为默认值?

  • 问题内容: 我有一个文件,其中我在页面顶部显示外部页面(使用iframe),其他部分是写在文件中的html代码的输出。 HTML代码如下所示: 现在,我想以编程方式刷新页面而不刷新。 我的问题是我可以不刷新页面就刷新页面吗? 答案/提示将不胜感激。 问题答案: 该嵌在主HMTL页面(或在JSP)。因此,如果刷新页面,则肯定会再次加载iframe。 为了避免这种情况,我可以考虑以下两种选择: 使用A