【问题标题】:How to delete floor plan children如何删除平面图儿童
【发布时间】:2022-01-10 12:59:52
【问题描述】:

我有这样的物业实体和平面图实体

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "properties", indexes = {@Index(name = "properties_parent_id_index", columnList = "parent_id", unique = true)})
public class PropertyEntity extends BaseEntity {



    @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "property_id")
    private List<FloorPlanEntity> floorPlans;

....
...
}

现在我尝试删除孩子并保存父母

喜欢这个`

propertyEntity.getFloorPlans().clear();
propertyDataService.save(propertyEntity);

但它给出了这样的例外

原因:org.postgresql.util.PSQLException:错误:关系“floor_plans”的“property_id”列中的空值违反了非空约束

【问题讨论】:

  • 首先要么删除父级,要么将字段 property_id 更新为新平面图的值。这个错误只是说你的数据库有一个约束,其中必须存在一个关系 floor_plans。
  • 我没有新的平面图只是想删除它们并保存
  • 由于数据库的限制,这是不可能的

标签: java spring hibernate


【解决方案1】:

我认为您可以使用@OneToMany(orphanRemoval = true) 它提供了一种从数据库中删除孤立实体的方法。 因此,当它从列表中删除时,它应该从数据库中删除 FloorPlanEntity。 有一些带有解释的教程: https://www.baeldung.com/jpa-cascade-remove-vs-orphanremoval#orphanremoval

【讨论】:

  • 你读过约束吗?他父记录中的该字段不能为空。这就是问题所在。
  • 是的。在这种情况下,orphanRemoval = true 它应该以下列方式工作:当您清理列表并保存父实体时,Hibernate 将从 floor_plans 中删除相应的实体。因此,表中不会有空 id 的行。 (使用您当前的配置,它只是从子实体中删除 property_id 列的值)
  • stackoverflow.com/users/5730762/alexander-terekhov。不,它不起作用我添加了孤儿删除 true 然后创建 propertyEntity.getFloorPlans().clear() 然后保存了 proepertyEntity 相同的错误
  • 好的,非常感谢它起作用了,但是我删除了非空约束然后它起作用了
猜你喜欢
  • 1970-01-01
  • 2021-08-21
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多