Невозможно удалить в @onetomany отношения весны данных jpa - PullRequest
2 голосов
/ 04 апреля 2020

В моем весеннем загрузочном проекте у меня есть одна сущность 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);
}                       

Ответы [ 2 ]

3 голосов
/ 04 апреля 2020

Такое поведение возникает, когда удаленный объект сохраняется в текущем сеансе.

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());
}  
1 голос
/ 04 апреля 2020

Если вы используете Spring Data - CrudRepository предоставляет deleteAll(Iterable<? extends T> entities) лучше использовать его, т.е.

quickPopValueRepository.deleteAll(quickPopValues)
...