JPA - Принудительная фиксация транзакции после TransactionSystemException

Я разрабатываю приложение с 3 серверами для развертывания: dev, home prod. В базе данных есть просмотры из других баз данных. В процессе разработки у нас есть контроль над нашей БД, и мы можем создать представление и вставить некоторые данные для тестирования. В разработке и производстве мы не контролируем БД. Итак, некоторые представления еще не созданы.

Я должен любить это

public class myDTO {
  Long id;
  Double quantity;
  Map<String, Double> loadTypes; // come from view
}

У меня есть метод findAll в классе @Transactional, который получает loadTypes из БД, но поскольку мой класс - @Transactional, когда я пытаюсь получить доступ к таблице, я получил ошибку 500, а myDTO не возвращается, я хочу вернуть остальную часть DTO даже при просмотре который мне нужен для получения loadTypes, не существует. Есть ли способ сделать это?

Я получаю эту ошибку

org.springframework.transaction.TransactionSystemException: Could not commit JPA transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:526)

Даже если бы вы нашли способ сделать это, это было бы ужасно. Ваша проблема в том, что вы пытаетесь использовать отсутствующее представление. Не делай этого. Зачем вашему коду пытаться использовать несуществующие ресурсы?

Kayaman 02.08.2018 13:48

@Kayaman Я знаю, это действительно странно, но поскольку id и quantity должны появляться на экране даже без loadTypes, следует ли мне разделить DTO? Наш руководитель хочет вернуть данные, даже если представление еще не существует

Rafael Andrade 02.08.2018 13:54

DTO - это не ваша проблема, а ваша сущность. Если вы пишете код, который работает по-разному в зависимости от схемы базы данных (что является действительно плохой идеей для начала), вам придется выполнять пользовательскую загрузку и другие вещи. Hibernate предполагает, что вы знаете базу данных, с которой работаете, и ничего из того, что вы собираетесь делать, «загрузите это, если она есть».

Kayaman 02.08.2018 13:57

В конечном итоге представление будет создано @Kayaman. Но займет некоторое время, нам нужно открыть заявку, ИТ-команда клиента обновит БД. Код работает нормально, но из-за этого наш руководитель не хочет видеть ответ 500. Я пытаюсь что-то сделать только до тех пор, пока это представление не будет создано в hom и production.

Rafael Andrade 02.08.2018 15:20

Что ж, надеюсь, вы понимаете, что делаете что-то ужасное. Неправильно иметь базу данных в неопределенном состоянии, что бы ни говорил «лидер». Вероятно, вам придется работать с собственными запросами и выполнять всевозможные частичные загрузки. Код в вашем примере не показывает вашу сущность, то, как вы ее загружаете, или что-то еще относящееся, поэтому решить вашу непосредственную проблему сложно. Я рекомендую прочитать много материалов по Hibernate, так как вы, кажется, не очень разбираетесь в этом.

Kayaman 03.08.2018 07:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
287
0

Другие вопросы по теме