Автор оригинала: Johnny Morgan.
В этом посте объясняется технология JPA и ее использование в разработке java. Эксперты java development India объясняют пример использования технологий – JPA и Hibernate, базы данных MySQL, Maven. Прочитайте этот пост и узнайте, что они хотят сказать.
Технология: JPA расшифровывается как API сохранения Java, который является стандартом Sun MicroSystems для сохранения. ORM расшифровывается как объектно-реляционное сопоставление. JPA является стандартом для ORM. Если фреймворк должен указывать ORM, то он должен реализовывать все спецификации, предоставленные JPA. JPA – это просто спецификация, она должна обеспечивать постоянство для операций CRUD. Спящий режим, затмение и т. Д. Являются примером поставщиков сохраняемости.
Технологии: JPA и Hibernate, Maven, база данных MySQL
Пример использования: Если вы работаете над приложениями для разработки Java с JPA, hibernate, eclipselink, вы часто будете получать исключения ниже:
javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect).
Проблема в том, что поставщик сохраняемости JPA пытается обновить объект, который не является объектом последней версии. Как правило, реляционные базы данных поддерживают версию всякий раз, когда в таблице обновляется запись. Если вы хотите обновить запись в таблице, вам следует взять запись последней версии из базы данных и обновить ее. Поскольку мы используем ORM, мы должны взять объект последней версии и объединить его.
Таким образом, в этом документе мы можем увидеть, когда возникает эта ошибка и как ее устранить.
1. Структура проекта
Структура проекта будет похожа на приведенный выше скриншот.
Если вы посмотрите на структуру проекта, это проект maven pom.xml
является обязательным его файлом. В этом файле maven мы можем настроить зависимости для jpa, гибернации, java, базы данных и т.д. Я использую базу данных MySQL для хранения данных.
Три пакета, один для сущности, один для бизнес-логики, один для тестирования приложений. Если вы заметите, что существует один пакет DTO, если вы работаете с многоуровневыми объектами приложений, они не будут напрямую доступны на клиентском уровне. Объект будет преобразован в DTO (Объект передачи данных), который будет сопоставлен с объектами.
2. Зависимости проекта
4.0.0 naveen.examples jpa 0.0.1-SNAPSHOT jar jpa http://maven.apache.org UTF-8 1.8 4.3.6.Final UTF-8 org.hibernate hibernate-entitymanager ${hibernate.version} org.hibernate hibernate-c3p0 ${hibernate.version} mysql mysql-connector-java 5.1.31 junit junit 3.8.1 test
3. Конфигурация JPA
Поскольку это Hibernate, добавлены зависимости hibernate, если это какая-то другая ФОРМА, добавьте эти зависимости.
org.hibernate.jpa.HibernatePersistenceProvider
Это persistence.xml
, здесь нам нужно упомянуть учетные данные базы данных, имя сохраняемости, все необходимые атрибуты фабрики entity manager.
4. мразь
Это класс сущностей, который будет сохраняться в базе данных.
// Import statements @NamedQueries({ @NamedQuery(name = EmployeeBE.FIND_ALL, query = "SELECT e FROM EmployeeBE e order by e.name "), }) @Entity @Table(name = "T_EMP") public class EmployeeBE implements Serializable{ private static final long serialVersionUID = 1607726899931733607L; public static final String FIND_ALL = "naveen.examples.jpa.entity.EmployeeBE.find_all"; @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; @Column(name = "NAME") private String name; @Column(name = "version_num") @Version private int version; // Getters and setters }
// Interface for CRUD operations. package naveen.examples.jpa.business; import java.util.List; import naveen.examples.jpa.entity.EmployeeBE; public interface EmployeeCrud { ListfindAllEmployeeBECol(); EmployeeBE saveEmployee(EmployeeBE employeeBE); EmployeeBE updateEmployee(EmployeeBE employeeBE); EmployeeBE findById(int id); }
// Implementatino class for CRUD operations public class EmployeeCrudImpl implements EmployeeCrud{ public EmployeeBE saveEmployee(EmployeeBE employeeBE) { EntityManager em = EntityManagerUtil.getEntityManager(); em.getTransaction().begin(); em.persist(employeeBE); em.getTransaction().commit(); return employeeBE; } public EmployeeBE updateEmployee(EmployeeBE employeeBE) { EntityManager em = EntityManagerUtil.getEntityManager(); em.getTransaction().begin(); em.merge(employeeBE); em.getTransaction().commit(); return employeeBE; } @SuppressWarnings("unchecked") public ListfindAllEmployeeBECol() { EntityManager em = EntityManagerUtil.getEntityManager(); Query query = em.createNamedQuery(EmployeeBE.FIND_ALL); return query.getResultList(); } public EmployeeBE findById(int id) { EntityManager em = EntityManagerUtil.getEntityManager(); return em.find(EmployeeBE.class, id); }
// Entity Manager public class EntityManagerUtil { private static EntityManager entityManager; private EntityManagerUtil() { } public static EntityManager getEntityManager() { if(entityManager==null){ EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("jpa-example"); return emFactory.createEntityManager(); } return entityManager; } }
Если вы посмотрите на приведенные выше фрагменты кода, у нас есть
- Интерфейс, определяет методы ведения бизнеса
- Интерфейс, внедрение бизнес-методов
- Утилита управления сущностями, чтобы получить объект entitymanager.
В классе EntityManagerUtil
мы передаем параметр jpa-пример, который мы упоминаем в persistence.xml
файл, поэтому он будет подключаться к этому блоку сохранения.
5. ДЕМОНСТРАЦИЯ
Продемонстрируйте, как попасть в исключение оптимистичной блокировки JPA.
public class Application { public static void main(String args[]) { EmployeeCrud employeeCrud = new EmployeeCrudImpl(); ListemployeeBEs = employeeCrud.findAllEmployeeBECol(); if(!employeeBEs.isEmpty()){ EmployeeBE employeeBE = employeeBEs.get(0); employeeBE.setName("Updated"); employeeCrud.updateEmployee(employeeBE); // Here Optimistic lock exception employeeCrud.updateEmployee(employeeBE); }else{ EmployeeBE employeeBE = new EmployeeBE(); employeeBE.setName("Naveen"); employeeBE = employeeCrud.saveEmployee(employeeBE); } }
Перед запуском приложения в БД нет данных
Если вы запустите приложение
Если вы заметите, что в таблице есть данные с идентификатором 16 и версией 0.
Сейчас если вы запустите приложение в режиме отладки
Если вы заметили, что первое обновление завершено, но в коде есть тот же объект employee, так как первый метод обновления завершен, он уже зафиксирован, поэтому версия становится 1.
Если вы посмотрите на скриншот, версия стала 1, но объект является старым, что означает версию 0. Теперь, если второй метод обновления выполняется со старым объектом, вы получите исключение Optimisticlockexception.
Если вы продолжите выполнение, это приведет к оптимистичному исключению блокировки.
6. Решение
Чтобы устранить эту ошибку, у нас есть два способа:
- Получите последний объект из базы данных и установите значения старого объекта, если вам нужно, чтобы эти значения сохранялись в новом объекте, и объедините его.
- Для старого объекта установите последнюю версию из базы данных.
Я следую второму подходу, если вы видите скриншот, я устанавливаю номер последней версии на старый объект
После выполнения в консоли ошибка отсутствует:
Это SQL-запрос, сгенерированный для второго метода обновления. Так что исключения не произошло.
Эксперты Java development India поделились своими лучшими знаниями о технологии JPA и ее использовании в проекте java. Если вам нужна более подробная информация, вы можете спросить разработчиков, которые уже применяют эту технологию в своих проектах.
Вывод
Используя эти два способа, вы можете устранить эту довольно досадную ошибку. Поскольку это очень простой пример, вы можете легко его найти, но в приложении реального времени вы не найдете этого настолько простым. Поэтому всякий раз, когда вы получаете это исключение, запустите приложение в режиме отладки и перейдите к приблизительному фрагменту кода, где он отображается, затем нажмите F5 в отладке и углубитесь в реализацию менеджера сущностей соответствующего поставщика сохраняемости где-то еще, где обновляется ваша сущность. Затем следуйте 4 из этих двух методов в зависимости от ваших требований. Продолжайте проверять номер версии в базе данных. Для каждого изменения они могут увеличиваться или не увеличиваться в зависимости от реализации поставщика сохраняемости.
Рекомендации
Оригинал: “https://mkyong.com/jpa/jpa-optimistic-lock-exception-in-java-development/”