在我的春季启动程序中,我下面有一个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);
}
当已删除的对象在当前会话中保留时,会发生这种行为。
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());
}
假设您正在使用Spring Data-CrudRepository提供了deleteAll(Iterable<? extends T> entities)
更好地使用它,即
quickPopValueRepository.deleteAll(quickPopValues)