EntityManager.persist() не работает с @Transactional ⇐ JAVA
EntityManager.persist() не работает с @Transactional
Я пытаюсь научиться использовать аннотацию @Transactional в Spring (я не использую Spring Boot). Но когда я переключаюсь со своего рабочего метода с помощью Begin() и commit() на метод с @Transactional, мои объекты не сохраняются. Можете ли вы помочь мне понять, что я делаю не так?
Без транзакционного/рабочего метода:
public S save (Sentity) { EntityManager em = pu.getEntityManager(); пытаться { logger.debug("Пытаюсь сохранить " + ((Message)entity).toString()); em.getTransaction().begin(); em.persist(сущность); em.getTransaction().commit(); logger.debug("MessageRepository.save() - после .commit()"); } поймать (PersistenceException е) { logger.error("Объект уже существует"); е.printStackTrace(); } окончательно { Система.out.println(); эм.закрыть(); } возврат объекта; } Если @Transactional/не работает:
@Transactional @Override public S save (Sentity) { EntityManager em = pu.getEntityManager(); em.persist(сущность); возврат объекта; } А вот мой класс PersustanceUtil (pu):
пакет com.cypherf.repository; импортировать jakarta.persistence.EntityManager; импортировать jakarta.persistence.EntityManagerFactory; импортировать jakarta.annotation.PreDestroy; импортировать org.hibernate.SessionFactory; импортировать org.hibernate.boot.MetadataSources; импортировать org.hibernate.boot.registry.StandardServiceRegistry; импортировать org.hibernate.boot.registry.StandardServiceRegistryBuilder; импортировать org.springframework.context.annotation.Bean; импортировать org.springframework.context.annotation.Configuration; импортировать org.springframework.orm.hibernate5.HibernateTransactionManager; импортировать org.springframework.orm.jpa.JpaTransactionManager; импортировать org.springframework.stereotype.Service; импортировать org.springframework.transaction.PlatformTransactionManager; импортировать javax.sql.DataSource; @Конфигурация @Услуга общественный класс PersistenceUtil { частный статический EntityManagerFactory emf = null; @Бин общественный PlatformTransactionManager txManager () { вернуть новый JpaTransactionManager(getEntityManagerFactory()); } /** * Создает фабрику менеджера сущностей как одноэлементный экземпляр и возвращает ее. * * @return EntityManagerFactory */ общественный EntityManagerFactory getEntityManagerFactory () { если (ЭДС == ноль) { синхронизировано (EntityManagerFactory.class) { если (ЭДС == ноль) { окончательный StandardServiceRegistry sr = новый StandardServiceRegistryBuilder() .configure() // Настраивает параметры из hibernate.cfg.xml .строить(); пытаться { emf = новые источники метаданных (ср).buildMetadata().buildSessionFactory(); } поймать (Исключение е) { StandardServiceRegistryBuilder.destroy(sr); бросить е; } } } } возврат ЭДС; } /** * Закрывает фабрику менеджеров объектов. */ @PreDestroy public static void closeEntityManagerFactory() { System.out.println("PersistenceUtil.closeEntityManagerFactory()"); если (ЭДС != ноль) { System.out.println("Закрытие ЭДС"); ЭМФ.закрыть(); } } /** * Возвращает новый экземпляр EntityManager * * @return новый экземпляр EntityManager */ общественный EntityManager getEntityManager () { return getEntityManagerFactory().createEntityManager(); } } Основной класс:
пакет com.cypherf; импортировать com.cypherf.model.Message; импортировать com.cypherf.repository.MessageRepository; импортировать com.cypherf.service.MessageService; импортировать org.slf4j.Logger; импортировать org.slf4j.LoggerFactory; импортировать org.springframework.beans.factory.annotation.Autowired; импортировать org.springframework.context.ApplicationContext; импортировать org.springframework.context.annotation.AnnotationConfigApplicationContext; импортировать org.springframework.context.annotation.ComponentScan; импортировать org.springframework.context.annotation.Configuration; импортировать org.springframework.data.repository.CrudRepository; импортировать org.springframework.transaction.annotation.EnableTransactionManagement; @Конфигурация @ComponentScan @EnableTransactionManagement общественный класс TestSpringApplication { @Autowired частный контекст ApplicationContext; @Autowired частный CrudRepository репозиторий сообщений; @Autowired частная служба сообщений messageService; окончательный статический регистратор Logger = LoggerFactory.getLogger(TestSpringApplication.class); public static void main(String[] args) { ApplicationContext ctx = новый AnnotationConfigApplicationContext(TestSpringApplication.class); Приложение TestSpringApplication = ctx.getBean(TestSpringApplication.class); logger.info("Запуск приложения..."); app.run(аргументы); // Приложение TestSpringApplication = context.getBean(TestSpringApplication.class); //Приложение TestSpringApplication = новое TestSpringApplication(); //app.run(args); } public void run(String... args) { messageRepository.save(new Message("Сообщение первое"); messageRepository.save(new Message("Сообщение второе"); messageService.printAllMessages(); messageRepository.save(new Message("Сообщение второе"); messageService.printAllMessages(); // System.out.println("BEANS:"); // Компоненты List = Arrays.asList(context.getBeanDefinitionNames()); // beans.forEach(bean -> System.out.println(bean)); } }
Я пытаюсь научиться использовать аннотацию @Transactional в Spring (я не использую Spring Boot). Но когда я переключаюсь со своего рабочего метода с помощью Begin() и commit() на метод с @Transactional, мои объекты не сохраняются. Можете ли вы помочь мне понять, что я делаю не так?
Без транзакционного/рабочего метода:
public S save (Sentity) { EntityManager em = pu.getEntityManager(); пытаться { logger.debug("Пытаюсь сохранить " + ((Message)entity).toString()); em.getTransaction().begin(); em.persist(сущность); em.getTransaction().commit(); logger.debug("MessageRepository.save() - после .commit()"); } поймать (PersistenceException е) { logger.error("Объект уже существует"); е.printStackTrace(); } окончательно { Система.out.println(); эм.закрыть(); } возврат объекта; } Если @Transactional/не работает:
@Transactional @Override public S save (Sentity) { EntityManager em = pu.getEntityManager(); em.persist(сущность); возврат объекта; } А вот мой класс PersustanceUtil (pu):
пакет com.cypherf.repository; импортировать jakarta.persistence.EntityManager; импортировать jakarta.persistence.EntityManagerFactory; импортировать jakarta.annotation.PreDestroy; импортировать org.hibernate.SessionFactory; импортировать org.hibernate.boot.MetadataSources; импортировать org.hibernate.boot.registry.StandardServiceRegistry; импортировать org.hibernate.boot.registry.StandardServiceRegistryBuilder; импортировать org.springframework.context.annotation.Bean; импортировать org.springframework.context.annotation.Configuration; импортировать org.springframework.orm.hibernate5.HibernateTransactionManager; импортировать org.springframework.orm.jpa.JpaTransactionManager; импортировать org.springframework.stereotype.Service; импортировать org.springframework.transaction.PlatformTransactionManager; импортировать javax.sql.DataSource; @Конфигурация @Услуга общественный класс PersistenceUtil { частный статический EntityManagerFactory emf = null; @Бин общественный PlatformTransactionManager txManager () { вернуть новый JpaTransactionManager(getEntityManagerFactory()); } /** * Создает фабрику менеджера сущностей как одноэлементный экземпляр и возвращает ее. * * @return EntityManagerFactory */ общественный EntityManagerFactory getEntityManagerFactory () { если (ЭДС == ноль) { синхронизировано (EntityManagerFactory.class) { если (ЭДС == ноль) { окончательный StandardServiceRegistry sr = новый StandardServiceRegistryBuilder() .configure() // Настраивает параметры из hibernate.cfg.xml .строить(); пытаться { emf = новые источники метаданных (ср).buildMetadata().buildSessionFactory(); } поймать (Исключение е) { StandardServiceRegistryBuilder.destroy(sr); бросить е; } } } } возврат ЭДС; } /** * Закрывает фабрику менеджеров объектов. */ @PreDestroy public static void closeEntityManagerFactory() { System.out.println("PersistenceUtil.closeEntityManagerFactory()"); если (ЭДС != ноль) { System.out.println("Закрытие ЭДС"); ЭМФ.закрыть(); } } /** * Возвращает новый экземпляр EntityManager * * @return новый экземпляр EntityManager */ общественный EntityManager getEntityManager () { return getEntityManagerFactory().createEntityManager(); } } Основной класс:
пакет com.cypherf; импортировать com.cypherf.model.Message; импортировать com.cypherf.repository.MessageRepository; импортировать com.cypherf.service.MessageService; импортировать org.slf4j.Logger; импортировать org.slf4j.LoggerFactory; импортировать org.springframework.beans.factory.annotation.Autowired; импортировать org.springframework.context.ApplicationContext; импортировать org.springframework.context.annotation.AnnotationConfigApplicationContext; импортировать org.springframework.context.annotation.ComponentScan; импортировать org.springframework.context.annotation.Configuration; импортировать org.springframework.data.repository.CrudRepository; импортировать org.springframework.transaction.annotation.EnableTransactionManagement; @Конфигурация @ComponentScan @EnableTransactionManagement общественный класс TestSpringApplication { @Autowired частный контекст ApplicationContext; @Autowired частный CrudRepository репозиторий сообщений; @Autowired частная служба сообщений messageService; окончательный статический регистратор Logger = LoggerFactory.getLogger(TestSpringApplication.class); public static void main(String[] args) { ApplicationContext ctx = новый AnnotationConfigApplicationContext(TestSpringApplication.class); Приложение TestSpringApplication = ctx.getBean(TestSpringApplication.class); logger.info("Запуск приложения..."); app.run(аргументы); // Приложение TestSpringApplication = context.getBean(TestSpringApplication.class); //Приложение TestSpringApplication = новое TestSpringApplication(); //app.run(args); } public void run(String... args) { messageRepository.save(new Message("Сообщение первое"); messageRepository.save(new Message("Сообщение второе"); messageService.printAllMessages(); messageRepository.save(new Message("Сообщение второе"); messageService.printAllMessages(); // System.out.println("BEANS:"); // Компоненты List = Arrays.asList(context.getBeanDefinitionNames()); // beans.forEach(bean -> System.out.println(bean)); } }
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ошибка дублирующейся записи JPA в EntityManager.remove, а затем в EntityManager.persist
Anonymous » » в форуме JAVA - 0 Ответы
- 21 Просмотры
-
Последнее сообщение Anonymous
-