Как изменить поле, которым является Entity в Spring Data JPA? - PullRequest
0 голосов
/ 25 января 2020

У меня есть две сущности - TypeReport и GroupParameter. GroupParameter имеет поле TypeReport.

Мои объекты:

GroupParameter

@Entity
@Data
public class GroupParameter {

    @Id
    @GeneratedValue(generator = ID_GENERATOR)
    private Long id;
    private String title;
    private boolean common;
    @ManyToOne
    @JoinColumn(name = "TYPE_REPORT_ID", nullable = false)
    private TypeReport typeReport;

}

TypeReport

@Data
@Entity
public class TypeReport {

    @Id
    @GeneratedValue(generator = ID_GENERATOR)
    private Long id;

    @Column(nullable = false)
    private String title;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private Standard standard;

}

Клиент отправляет мне GroupParameterDTO:

@Data
public class GroupParameterDTO {

    private Long id;
    private String title;
    private boolean common;
    private String typeReportId;

}

Клиент может изменить некоторые поля из GroupParameter и отправить любые наборы полей: - title - title, typeReportId - typeReportId

Например:

{
 title: "new Title"
}

Тогда У меня есть:

GroupParameterDTO {

    private Long id = null;
    private String title = "new Title";
    private boolean common = false; //It will be ignored
    private String typeReportId = null;

}

Когда я пытаюсь изменить typeReport, у меня может быть две ситуации:

  • typeReportId = null - я не должен изменять typeReport в GroupParameter
  • typeReportId = что-то - я должен изменить typeReport в GroupParameter без изменения полей typeReport

Что мне делать?

  1. Я нахожу GroupParameter в БД по id:

GroupParameter groupParametersFromDB = findById(id);

Я заполняю GroupParameter данными, полученными от клиента:

groupParameterMapper.fillGroupParameters(groupParameters, groupParametersFromDB);

 @Override
    public void fillGroupParameters(GroupParameter source, GroupParameter target) {
        if ( source == null ) {
            return;
        }

        if ( source.getTypeReport() != null ) {
            if ( target.getTypeReport() == null ) {
                target.setTypeReport( new TypeReport() );
            }
            typeReportToTypeReport( source.getTypeReport(), target.getTypeReport() );
        }
        if ( source.getTitle() != null ) {
            target.setTitle( source.getTitle() );
        }
    }

protected void typeReportToTypeReport(TypeReport typeReport, TypeReport mappingTarget) {
        if ( typeReport == null ) {
            return;
        }

        if ( typeReport.getId() != null ) {
            mappingTarget.setId( typeReport.getId() );
        }
        mappingTarget.setTitle( typeReport.getTitle() );
        mappingTarget.setStandard( typeReport.getStandard() );
    }
Я пытаюсь сохранить свой GroupParameter: groupParameterRepository.save(groupParametersFromDB);

Но я получаю ошибки.

Когда я пытаюсь изменить id:

org .hibernate.HibernateException: идентификатор экземпляра ru.watchlist.domain.TypeReport был изменен с 1 на 3

Когда я не пытаюсь изменить идентификатор (когда изменяется только заголовок):

org. postgresql .util.PSQLException: ОШИБКА: нулевое значение в столбце "стандартный" нарушает ненулевое ограничение

Я думаю, что репозиторий пытается сохранить typeReport вместо этого измените ссылку на другую в GroupParameter при сохранении GroupParameter.

Я не хочу вносить какие-либо изменения в typeReport при сохранении GroupParameter. Я хочу только изменить ссылку на typeReport в GroupParameter.

Как я могу это сделать?

1 Ответ

0 голосов
/ 25 января 2020

Если клиент говорит вам, что он / она хочет, чтобы идентификатор отчета о типе параметра группы был равен 3, это не значит, что он / она хочет изменить идентификатор отчета о типе.

Это означает, что он / она хочет, чтобы у параметра группы был другой отчет о типе, идентифицируемый идентификатором 3.

Таким образом, вы получаете отчет о типе из базы данных, и Вы назначаете это параметру группы:

groupParameter.setTypeReport(typeReportRepository.findById(3).orElseThrow(...))
...