Почему для столбца нельзя установить значение NULL с помощью JPA? - PullRequest
0 голосов
/ 16 апреля 2020

Давайте начнем с этой сущности:

@Entity
public class MyEntity {
  ...
  @Column(length = 80)
  private String description;

  @Column(name = "enum_column", precision = 18)
  @Convert(converter = EnumColumnConverter.class)
  private MyEnum enumColumn;
  ...
}

Здесь вы видите два столбца, которые можно обнулять (в моей сущности и в базе данных). Преобразователь заменяет перечисление значением Long в базе данных. Класс хранилища определяется соответственно:

@Repository
public interface MyEntityRepository extends JpaRepository<MyEntity, Long> {}

DTO определяется из пакета услуг:

public class MyEntityDto {
  ...
  private String description;
  private MyEnum enumColumn;
  ...
}

Отображение между DTO и объектами выполняется с помощью Dozer. DTO модифицируется от Java FX UI. Служба была определена между пользовательским интерфейсом и сохранением для сохранения измененных объектов.

@Service
@Transactional
public class MyEntityService {
  @Autowired MyEntityRepository myEntityRepository;

  ...

  public List<MyEntityDto> save(List<MyEntityDto> dtosToSave) {
    List<MyEntityDto> results = Collections.emptyList();

    if (dtosToSave != null && !dtosToSave.empty()) {
      Iterable<MyEntity> entities = convertDtosWithDozer(dtosToSave);
      List<MyEntity> savedEntities = myEntityRepository.saveAll(entities);
      results = convertEntitiesWithDozer(savedEntities);
    }
    return results;
}

Из пользовательского интерфейса я изменяю существующую строку, в которой оба значения description и enumColumn не являются null. Оба значения установлены на null.

Проблема заключается в том, что ни одно из них не установлено на null в базе данных. В журналах запрос update, сгенерированный Hibernate, не включает эти столбцы. Когда я отлаживаю код, эти столбцы null в dtosToSave, entities, savedEntities и results.

Я создал модульный тест для MyEntityRepository, где я сохраняю сущность с не ноль description и entityColumn. Я перезагружаю сущность из базы данных, используя репозиторий, чтобы убедиться, что эти столбцы не равны NULL. Я установил их на null, сохранил объект и загрузил его обратно из базы данных. Теперь оба столбца действительно null, чего я и ожидал.

Мой вопрос: чего мне здесь не хватает? Почему хранилище не сохраняет null столбцы? Если я установлю любое ненулевое значение, оно будет работать отлично.

Заранее спасибо.

ОБНОВЛЕНИЕ: может ли моя проблема быть связана с этим? Jpa Repository save () не обновляет существующие данные

1 Ответ

0 голосов
/ 16 апреля 2020

Вы преобразуете свои dtos в сущности через dozer, но поскольку эти точечные сущности все еще находятся в отдельном состоянии .... для обновления существующих сущностей вам сначала необходимо загрузить их через базу данных через ваш репозиторий. Что-то вроде repository.findById(Id id);

Тогда вы получите сущность в «присоединенном» состоянии, и будут применены переходы состояний (обновление полей).

В течение save() всех ваших переходов состояний сущностей будет переведен в соответствующий DML, и ваше обновление должно работать сейчас.

И в отношении этого утверждения

 I reload the entity from the database using the repository to be sure these columns are not null. I set them to null, save the entity, and load it back from the database. Now both columns are indeed null, which is what I've been expecting.

Как вы сказали you reload entity from the database, чтобы оно работало

...