Описание проблемы: я использую Hibernate с Spring Boot для сохранения данных в базе данных H2. При попытке сохранить новую запись в таблице «устройство» Hibernate выдает ошибку с указанием «NULL не разрешен для столбца «ID»». Я определил столбец «ID» как первичный ключ с автоматическим приращением в схеме базы данных.
Схема базы данных:
Код: Выделить всё
Код: Выделить всё
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "device")
public class Device {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String manufacturer;
private String model;
private int ram;
private int rom;
private String color;
@Enumerated(EnumType.STRING)
@Column(columnDefinition = "VARCHAR(255)")
private Spec spec;
private int quantity;
}
Код: Выделить всё
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DeviceDto {
private Long id;
private String manufacturer;
private String model;
private int ram;
private int rom;
private String color;
private String spec;
private int quantity;
}
Код: Выделить всё
@Mapper
public interface DeviceMapper {
DeviceMapper INSTANCE = Mappers.getMapper(DeviceMapper.class);
@Mapping(target = "spec", source = "spec", qualifiedByName = "specToString")
DeviceDto deviceToDeviceDto(Device device);
@Mapping(target = "spec", source = "spec", qualifiedByName = "stringToSpec")
@Mapping(target = "id", ignore = true)
Device deviceDtoToDevice(DeviceDto deviceDto);
@Named("specToString")
default String mapSpecToString(Spec spec) {
return spec != null ? spec.name() : null;
}
@Named("stringToSpec")
default Spec mapStringToSpec(String spec) {
return spec != null ? Spec.valueOf(spec) : null;
}
}
Код: Выделить всё
public DeviceDto addDevice(DeviceDto deviceDto) {
Device device = DeviceMapper.INSTANCE.deviceDtoToDevice(deviceDto);
Device savedDevice = deviceRepository.save(device);
return DeviceMapper.INSTANCE.deviceToDeviceDto(savedDevice);
}
@PostMapping("/add")
@Operation(summary = "Add device")
public DeviceDto addDevice(@RequestBody DeviceDto deviceDto) {
return deviceService.addDevice(deviceDto);
}
Подробнее здесь: https://stackoverflow.com/questions/787 ... -on-insert