У меня есть две сущности - 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
Что мне делать?
- Я нахожу 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.
Как я могу это сделать?