Nano Hash - криптовалюты, майнинг, программирование

Полное удаление и вставка исключения сброса сброса

У меня была одна проблема: нужно выполнить полное удаление, а затем вставить. Пробовал один подход, можете подсказать, есть ли другой лучший способ?

{   
  "incidentTime": 1491207083634,
  "estCode": 152,
  "incidentParamTrans": [
    {      
      "paramValueList": [
        11,
        12,
        14
      ]
    }
  ]
}

Это основной класс сущностей.

@Entity
@Table(name="IR_TB_INCIDENT_HDR")
public class IncidentHdr implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="IR_TB_INCIDENT_HDR_INCIDENTID_GENERATOR", sequenceName="IR_SEQ_INCIDENT_ID")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="IR_TB_INCIDENT_HDR_INCIDENTID_GENERATOR")
    @Column(name="INCIDENT_ID")
    private long incidentId;

    @OneToMany(cascade = {CascadeType.PERSIST,CascadeType.MERGE, CascadeType.REMOVE}, fetch = FetchType.LAZY,  mappedBy="incidentHdr")
    private Set<IncidentParamTran>  incidentParamTrans;

    public IncidentHdr() {
    }

}

Это класс сущностей с отображением один ко многим. где этот paramValueList в DTO (из запроса json) извлекается и вставляется в виде 3 (paramId) записей в таблицу IncidentParamTrans.

/**
 * The persistent class.
 * 
 */
@Entity
@Table(name="IR_TB_INCIDENT_PARAM_TRAN")
public class IncidentParamTran implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="IR_TB_INCIDENT_PARAM_TRAN_GENERATOR", sequenceName="IR_SEQ_INCIDENT_PARAM_RUN_ID")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="IR_TB_INCIDENT_PARAM_TRAN_GENERATOR")
    @Column(name="PARAM_RUN_ID")
    private long paramRunId;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="INCIDENT_ID")
    private IncidentHdr incidentHdr;


    @Column(name="PARAM_ID")
    private BigDecimal paramId;


    public IncidentParamTran() {
    }


}

Если ввод такой.

{   
  "incidentId": 4700,
  "incidentTime": 1491207083634,
  "estCode": 152,
  "incidentParamTrans": [
    {      
      "paramValueList": [
        10,
        14,
      ]
    }
  ]
}

Пришлось удалить все данные в таблице IncidentParamTrans, имея идентификатор инцидента 4700, где идентификатор инцидента не является первичным ключом.

После этого мне пришлось вставить все новые записи (2 записи) в IncidentParamTrans.

Выполнение полного удаления и новой вставки, что, в свою очередь, вызывает исключение сброса.

Код, который я пробовал

Фрагмент кода сервисного уровня

@Override
    @Transactional(rollbackFor=IncidentReportingException.class)
    public IncidentHdrDto saveIncidentReport(IncidentHdrDto incidentHdrDto)
    if(incidentHdrDto.getIncidentParamTrans()!= null ){
            Set<IncidentParamTranDto> incidentParamTranDtos = new HashSet<IncidentParamTranDto>();
        //  dto.getSensitivityPattern().remove
            IncidentHdr inc = mapper.map(incidentHdrDto, IncidentHdr.class);
            incidentParamTransRepo.deleteByIncidentHdr(inc);

            for(IncidentParamTranDto item:incidentHdrDto.getIncidentParamTrans()){

                if(item != null){
                    for(BigDecimal paramItem: item.getParamValueList()){
                        IncidentParamTranDto val = new IncidentParamTranDto();
                        val.setParamId(paramItem);
                        val.setIncidentHdr(incidentHdrDto);
                        incidentParamTranDtos.add(val);
                    }
                }
            }
            incidentHdrDto.setIncidentParamTrans(incidentParamTranDtos);
        }

        result = saveIncidentHdr(incidentHdrDto);
        }

сопоставьте dto с сущностью и вызовите метод сохранения репо.

    @Override
    public IncidentHdrDto saveIncidentHdr(IncidentHdrDto incidentHdrDto)
            throws IncidentReportingException {
        return mapper.map(iReportingRepo.save(mapper.map(incidentHdrDto, IncidentHdr.class)),IncidentHdrDto.class);
    }

Repo class used to delete 

    public interface IncidentParamTransRepo extends JpaRepository<IncidentParamTran, Long> {



    Long deleteByIncidentHdr(IncidentHdr inc);

}

Исключение:

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: om.gov.moh.irs.model.entity.incident.IncidentHdr

Ответы:


1

Я считаю, что это не удается из-за того, что коллекция IncidentHdr.incidentParamTrans остается в недопустимом состоянии, потому что фактическое удаление параметров инцидента обрабатывается вызовом репозитория incidentParamTransRepo.deleteByIncidentHdr(inc); , но, с другой стороны, право собственности на операции CRUD устанавливается на IncidentHdr.incidentParamTrans через каскад конфигурация поведения.

Чтобы избежать путаницы, я бы предложил попробовать следующий подход:

  1. Сначала преобразуйте «IncidentHdr.incidentParamTrans» в DTO для последующего использования.
  2. Очистить коллекцию IncidentHdr.incidentParamTrans : inc .getIncidentParamTrans().clear()
  3. Сохраните, сбросив IncidentHdr : incidentHdrRepository.**saveAndFlush**(inc). Это вызовет запрос на удаление, который вы выполняли с ручным вызовом репозитория. Важно выполнить сохранение с сбросом, чтобы фактический запрос на удаление выполнялся в этот момент до повторного заполнения коллекции.
  4. Снова заполните «IncidentHdr.incidentParamTrans» и сохраните / сохраните его.

Преимущество такого подхода в том, что Hibernate может отслеживать все изменения, внесенные в коллекцию IncidentHdr.incidentParamTrans, и следить за тем, чтобы состояния обрабатывались правильно. Одним из недостатков этого подхода является то, что он загружает всю коллекцию IncidentHdr.incidentParamTrans в память, однако, исходя из вашей конфигурации, я считаю, что это не должно быть проблемой, поскольку вы уже это делаете (делегируя управление CRUD IncidentHdr.incidentParamTrans объекту IncidentHdr ).

Надеюсь это поможет.

06.04.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..