Почему JPA / Hibernate разработали способ переопределения границ транзакций даже для одного оператора вставки / обновления БД? - PullRequest
0 голосов
/ 28 октября 2018

Везде написано, что сервисный (или любой другой) метод должен быть транзакционным для JPA Persistence Context, который будет создан, но я нигде не могу найти, что является мотивацией такого дизайна.

Скажем, я хочу вставить одну строку в БД, это всего лишь один оператор БД, который в любом случае будет транзакционным, если autocommit включен.Но внезапно, если вы используете JPA / Hibernate, тогда вы должны сделать свой бизнес-метод @Transactional для JPA, чтобы иметь возможность создавать контекст постоянства и выполнять этот единственный оператор.

В мире без JPA мы можем иметьнетранзакционный метод обслуживания, содержащий даже несколько операторов БД, конечно, рискуя потерять атомарность всей операции (это, безусловно, наш выбор), поэтому JPA спроектирован таким образом, что заставляет нас создавать транзакционные методы, даже когда этот методсодержит один оператор БД и в любом случае этот оператор будет выполняться в транзакции с autocommit=true?

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Не относится к JPA.Он связан с TransactionManager, который вы, вероятно, настроили для работы.JTA-Transactionmanager вместе с EntityManager-Object будет обрабатывать соединения с базой данных и следить за тем, чтобы вы не делали DB-Changes без запуска транзакции.

Сам JPA-Entitymanager содержит методы, которые вы можете использовать для обработки транзакций.

В EntityManager -javadoc вы видите:

TransactionRequiredException - если при вызове в диспетчере сущностей, управляемом контейнером, транзакция не выполняетсяТип PersistenceContextType.TRANSACTION

Таким образом, вы видите, как только вы используете TransactionManager, entitymanager получает управляемый контейнер.

Также смотрите: Управляемый контейнером Entitymanager

0 голосов
/ 28 октября 2018

Этот вопрос содержит более одной точки:

  1. JPA - это реализация ORM «Объектно-реляционное отображение», которая по определению сопоставляет объекты, которые вы используете, с данными в БД, двунаправленными идля этого нужно было решить проблемы, которые могут возникнуть, поэтому он вводит транзакции для решения таких проблем.
  2. (сохранение только одного элемента) не является атомарной операцией, поскольку у вас может быть две транзакции, сохраняющие разные данные в одном поле.об обновлении для создания или добавления вашего объекта, не отображенного до тех пор, пока вы не вызовете persist ", или если переход 2 имеет разные грязные значения, поэтому глобально ваша операция сохранения не
0 голосов
/ 28 октября 2018

Я полагаю, что все, что касается СУБД, будет транзакционным, даже если это атомарная операция или случай не в JPA.Говоря о потере данных, все зависит только от настроенного уровня изоляции .Даже если вы не используете какую-либо явную конфигурацию транзакции, например, используя JdbcTemlate или просто Java-ядро Statement, транзакция будет создана неявно.

Итак, отвечая на ваш вопрос, JPA заставляет использовать транзакцию, чтобы заставить разработчика понять свои действия.

В вашем случае ключевыми словами для получения ответа являются постоянство состояния .Вот хорошая статья , которая объясняет, как JPA работает с сущностями.

0 голосов
/ 28 октября 2018

Это не связано с JPA.Все операции с базой данных требуют транзакции, каждая из них.Дело в том, что иногда это просто скрыто от вас, как будто вы явно не создаете транзакцию, базовая структура сделает это за вас (это случай выбора сущностей в JPA).

В целом, JPAне заставляет вас, база данных заставляет вас делать это, и это характер СУБД.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...