Spring JPA неправильно разрешает имя таблицы при сохранении объекта
Я использую модель программирования облачных приложений для Java, разработанную SAP, чтобы предоставлять услуги OData своим коллегам. Это сочетается с Весной. Сервис определяется в файле cds следующим образом:
service POAccrualDataController {
entity POAccrualData {
key OPSYS : String(3);
EBELN : Integer;
controller : String(25);
}
}
В качестве теста я сделал простой контроллер:
@Controller
@ServiceName("POAccrualDataController")
public class POAccrualDataController2 implements EventHandler {
@Autowired
private POAccrualDataService poAccrualDataService;
@On(event = CdsService.EVENT_CREATE, entity = "POAccrualDataController.POAccrualData")
public void onCreate(POAccrualData data) {
POAccrualDataDTO dto = new POAccrualDataDTO();
dto.setOPSYS(data.getOpsys());
dto.setEBELN(data.getEbeln());
dto.setController(data.getController());
poAccrualDataService.insertPOAccrualData(dto);
}
@On(event = CdsService.EVENT_READ, entity = "POAccrualDataController.POAccrualData")
public List<POAccrualData> onRead() {
List<POAccrualDataDTO> dtoList = poAccrualDataService.getAllPOAccrualData();
List<POAccrualData> result = new ArrayList<>();
for(POAccrualDataDTO dto : dtoList) {
POAccrualData data = POAccrualData.create();
data.setOpsys(dto.getOPSYS());
data.setEbeln(dto.getEBELN());
data.setController(dto.getController());
result.add(data);
}
return result;
}
}
Определенный объект передачи данных, отображаемый базой данных, выглядит следующим образом:
@Entity
@Table(schema = "databroker")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class POAccrualDataDTO {
@Id
@Column
private String OPSYS;
@Column
private Integer EBELN;
@Column
private String controller;
}
Контроллер использует службу, показанную ниже:
@Service
public class POAccrualDataService {
@Autowired
private POAccrualDataRepository poAccrualDataRepository;
public void insertPOAccrualData(POAccrualDataDTO data) {
poAccrualDataRepository.save(data);
}
public List<POAccrualDataDTO> getAllPOAccrualData() {
return poAccrualDataRepository.findAll();
}
}
который имеет доступ к
@Repository
public interface POAccrualDataRepository extends JpaRepository<POAccrualDataDTO, Long> {}
База данных настраивается liquibase. Проблема в том, что когда сервер запускается и я пытаюсь получить доступ к http://localhost:8080/odata/v4/POAccrualDataController/POAccrualData, запрос GET выполняется успешно, и в журналах я вижу следующую запись из спящего режима:
org.hibernate.SQL : select poaccruald0_.OPSYS as opsys1_0_,
poaccruald0_.EBELN as ebeln2_0_, poaccruald0_.controller as controll3_0_ from
databroker.POAccrualDataDTO poaccruald0_
но когда я делаю то же самое с POST с использованием Postman, запускаю запрос со следующим телом:
{
"OPSYS": "XXX",
"EBELN": 10,
"controller": "controller"
}
производит этот вывод:
org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "POACCRUALDATACONTROLLER_POACCRUALDATA" not
found; SQL statement: INSERT INTO POAccrualDataController_POAccrualData (EBELN, OPSYS,
controller) VALUES (?, ?, ?)
При выполнении сохранения имя таблицы по какой-то причине меняется, и поэтому я не могу сохранять новые объекты в базе данных. Я проверил в консоли H2, все ли работает нормально, и выполнение вставки SQL таким образом работает. Я также предоставил пользовательскую стратегию именования, чтобы проверить, определены ли некоторые идентификаторы неправильно, и, похоже, это не проблема. Я считаю, что библиотека CAP, предоставляемая SAP, определяет собственные компоненты Spring, которые перезаписывают некоторое поведение по умолчанию, поэтому я предоставил свою собственную конфигурацию JPA для восстановления некоторых свойств. У кого-нибудь есть идея, что может быть источником проблем? Ссылка на репозиторий с полным проектом, где вы можете найти pom.xml, файл liquibase и мою пользовательскую конфигурацию: репозиторий.