【问题标题】:jpa and postgres delete : 'ERROR: number of columns (1703) exceeds limit (1664)' & failsjpa 和 postgres 删除:'错误:列数 (1703) 超过限制 (1664)' & 失败
【发布时间】:2015-06-03 11:01:51
【问题描述】:

我们正在使用 JPA(休眠)和 Postgres,

其中一个删除操作抛出错误“错误:列数 (1703) 超出限制 (1664)”

delete 方法如下所示,我们将 clazz 对象作为所有实体的父对象。

 protected <E extends T> E delete(UUID id, Class<E> clazz) {
    log.debug("deleting entity {}", id);
    E object = getEntityManager().find(clazz, id); //clazz is parent of all the entities
    if (object != null){
        getEntityManager().remove(object);
    }
    return object;
}

请指教

有类似的问题here,但没有具体答案?

谢谢

【问题讨论】:

  • 如果某些 SQL 语句抛出异常,那么您不认为显示 SQL 语句会很好吗? (将出现在日志中)。堆栈跟踪也会说明调用了什么,因此它在做什么
  • 我的 SQL 语句非常大,很抱歉由于某些原因我无法发布整个 sql 查询。
  • 我认为调用find() 时会抛出异常,因为有很多急切的关系。作为一种解决方法,请尝试使用 getReference() 而不是 find(),例如 E object = getEntityManager().getReference(clazz, id);
  • 似乎Hibernate中的PostgreSQL方言应该足够聪明来处理这个问题,但我想不是。
  • 如果不需要级联,是否可以使用delete 查询?

标签: hibernate postgresql jakarta-ee jpa hibernate-mapping


【解决方案1】:

确实,em.find 会在他的多个连接中引起很多问题,即使没有急切的关系。尝试将要操作的对象直接传递给getEntityManager() 而不仅仅是id。像这样的:

   protected <E extends T> E delete(Object object, Class<E> clazz) {
      log.debug("deleting entity {}", object.getId());         
      if (object != null){
         getEntityManager().remove(object);
      }
      return object;
   }

编辑:

关于级联的更多信息:当你的关联中有太多的 cascadetype.ALL 时,你在映射中的每个表中的每一列都会被 hibernate 加入并最终抛出这个错误。

例如,我有一个没有 Eager 的实体,每个关联的表都是惰性获取类型,但有很多级联。

当我打电话给getEntityManager().merge(entity) 时,我收到了这个错误。我有一些包含 80 列和 100 列的表,可能不是最好的规范化,但仍然可以接受,我所做的是删除不需要的 cascadetype.MERGE,瞧。

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 2015-04-14
    • 2020-06-03
    • 2021-07-24
    • 1970-01-01
    • 2019-01-18
    • 2015-10-29
    • 2018-09-20
    • 1970-01-01
    相关资源
    最近更新 更多