首页 > 解决方案 > 无法在@OneToMany 关系弹簧数据 jpa 中删除

问题描述

在我的 spring boot 项目中,LineItem下面有一个实体是代码

@Entity
@Table(name = "scenario_lineitem")
@Data
@NoArgsConstructor
public class LineItem implements Cloneable {

    private static Logger logger = LoggerFactory.getLogger(GoogleConfigConstant.class);

    @Id
    @GeneratedValue(strategy = IDENTITY)   
    private BigInteger lineItemId;

    @Column
    private String name; 

    @OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.ALL, CascadeType.PERSIST, CascadeType.MERGE })
    @JoinColumn(name = "line_item_meta_id")
    private List<QuickPopValue> quickPopValues;   
}

另一个实体是

@Entity
@Table(name = "quick_pop_value")
@Data
@NoArgsConstructor
public class QuickPopValue implements Cloneable {

    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "quick_pop_value_id", columnDefinition = "bigint(20)", unique = true, nullable = false)
    private BigInteger quickPopValueId;

    @Column(name = "column_name")
    private String columnName;

    @Column(name = "value")
    private String value;

    @Column(name = "formula", columnDefinition = "longtext")
    private String formula;
}

现在我正在尝试QuickPopValue一一删除,但它没有被删除,也没有任何异常。

以下是删除代码:

List<QuickPopValue> quickPopValues = sheetRepository.findByColumnName(columnName);
for (QuickPopValue qpValue : quickPopValues) {
    quickPopValueRepository.delete(qpValue);
}                       

标签: javaspring-bootspring-data-jpaone-to-many

解决方案


当删除的对象保留在当前会话中时,会发生这种行为。

for (QuickPopValue qpValue : quickPopValues) {
    // Here you delete qpValue but this object persisted in `quickPopValues` array which is 
    quickPopValueRepository.delete(qpValue);
}   

要解决此问题,您可以尝试按 id 删除

@Modifying
@Query("delete from QuickPopValue t where t.quickPopValueId = ?1")
void deleteQuickPopValue(Long entityId);
for (QuickPopValue qpValue : quickPopValues) {
    quickPopValueRepository.deleteQuickPopValue(qpValue.getQuickPopValueId());
}  

推荐阅读