EntityManager.persist() не работает с @TransactionalJAVA

Программисты 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... аргументы) { 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)); } } Вот результат:
[...] 2419 [основная] DEBUG org.hibernate.event.internal.EntityCopyObserverFactoryInitiator — настроенная стратегия EntityCopyObserver: запретить 2518 [main] DEBUG org.hibernate.boot.internal.ClassLoaderAccessImpl — неизвестно, безопасно ли переданное имя класса [com.cypherf.model.Message] 2518 [main] DEBUG org.hibernate.boot.internal.ClassLoaderAccessImpl — временный ClassLoader не предоставлен; использование Live ClassLoader для загрузки потенциально небезопасного класса: com.cypherf.model.Message 2790 [основная] DEBUG org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl — HHH000513: невозможно создать ReflectionOptimizer для [com.cypherf.model.Message]: частный метод доступа [текст] 2853 [main] DEBUG org.hibernate.orm.model.mapping.creation — запуск обратных вызовов после инициализации 2853 [основная] DEBUG org.hibernate.orm.model.mapping.creation — запуск PostInitCallbackEntry: генератор Entity(com.cypherf.model.Message) `staticFetchableList` 2853 [основная] DEBUG org.hibernate.orm.model.mapping.creation — запуск PostInitCallbackEntry: интерпретация Entity(com.cypherf.model.Message) `sqmMultiTableInsertStrategy` 2946 [основная] DEBUG org.hibernate.persister.entity.AbstractEntityPersister — статический SQL для объекта: com.cypherf.model.Message 2946 [основная] DEBUG org.hibernate.persister.entity.AbstractEntityPersister — выбор версии: выберите идентификатор из сообщения, где id=? 2946 [основная] DEBUG org.hibernate.persister.entity.AbstractEntityPersister - Вставить (0): вставить в сообщение (текст, идентификатор) значения (?,?) 2946 [основная] DEBUG org.hibernate.persister.entity.AbstractEntityPersister — Обновление (0): обновление набора сообщений text=? где идентификатор=? 2946 [основная] DEBUG org.hibernate.persister.entity.AbstractEntityPersister — Удалить (0): удалить из сообщения, где id=? 2962 [main] DEBUG org.hibernate.orm.sql.ast.create — создан новый псевдоним SQL: m1_0. 2962 [main] DEBUG org.hibernate.orm.sql.ast.create — Регистрация TableGroup [StandardTableGroup(com.cypherf.model.Message)] с идентификаторомForTableGroup [com.cypherf.model.Message] для NavigablePath [com.cypherf. модель.Сообщение] 2993 [основная] DEBUG org.hibernate.orm.results.graph.AST — График DomainResult: \-EntityResultImpl [com.cypherf.model.Message] | \-BasicFetch [com.cypherf.model.Message.text] 2993 [основная] ОТЛАДКА org.hibernate.orm.sql.ast.tree — Дерево SQL AST: SelectStatement { FromClause { StandardTableGroup (m1: com.cypherf.model.Message) { PrimaryTableReference: Сообщение как m1_0 } } } 3040 [main] DEBUG org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator — JtaPlatform не указан, проверка преобразователя 3040 [main] DEBUG org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformResolverInitiator — JtaPlatformResolver не указан, используется значение по умолчанию [org.hibernate.engine.transaction.jta.platform.internal.StandardJtaPlatformResolver] 3056 [main] DEBUG org.hibernate.engine.transaction.jta.platform.internal.StandardJtaPlatformResolver — не удалось разрешить JtaPlatform, используя значение по умолчанию [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 3056 [основная] INFO org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator — HHH000489: платформа JTA недоступна (установите «hibernate.transaction.jta.platform», чтобы включить интеграцию платформы JTA) 3056 [main] DEBUG org.hibernate.type.spi.TypeConfiguration$Scope — определение области действия TypeConfiguration [org.hibernate.type.spi.TypeConfiguration@4d27d9d] на SessionFactoryImplementor [org.hibernate.internal.SessionFactoryImpl@3a209918] 3056 [main] DEBUG org.hibernate.query.named.NamedObjectRepository — проверка 0 именованных запросов HQL 3056 [main] DEBUG org.hibernate.query.named.NamedObjectRepository — проверка 0 именованных запросов SQL 3071 [основная] ОТЛАДКА org.hibernate.SQL - удалить таблицу, если она существует. Каскад сообщений Спящий режим: удалить таблицу, если она существует. Каскад сообщений 3087 [main] INFO org.hibernate.orm.connections.access - HHH10001501: соединение, полученное от JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@5170bc02] для (не JTA) выполнения DDL, не было выполнено в режиме автофиксации; «Локальная транзакция» соединения будет зафиксирована, и соединение будет переведено в режим автоматической фиксации. 3088 [основная] ОТЛАДКА org.hibernate.SQL - удалить последовательность, если существует Message_SEQ Спящий режим: удалить последовательность, если существует Message_SEQ 3088 [основная] ОТЛАДКА org.hibernate.SQL - создать последовательность Message_SEQ, начать с 1, увеличить на 50 Спящий режим: создать последовательность Message_SEQ, начать с 1, увеличить на 50 3088 [main] INFO org.hibernate.orm.connections.access - HHH10001501: соединение, полученное от JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4601047] для (не-JTA) выполнения DDL, не было в режиме автофиксации; «Локальная транзакция» соединения будет зафиксирована, и соединение будет переведено в режим автоматической фиксации. 3103 [основная] ОТЛАДКА org.hibernate.SQL - создать таблицу Сообщение ( идентификатор bigint не нулевой, текст varchar(255) уникальный, первичный ключ (идентификатор) ) Спящий режим: создать таблицу Сообщение ( идентификатор bigint не нулевой, текст varchar(255) уникальный, первичный ключ (идентификатор) ) 3119 [основная] ОТЛАДКА org.hibernate.internal.SessionFactoryRegistry — Инициализация SessionFactoryRegistry: org.hibernate.internal.SessionFactoryRegistry@40dd552c 3119 [основная] DEBUG org.hibernate.internal.SessionFactoryRegistry — регистрация SessionFactory: 0c3c67af-87cc-4b0a-bfd9-a5e6498e66fc () 3119 [основная] DEBUG org.hibernate.internal.SessionFactoryRegistry — не привязывать SessionFactory к JNDI, имя JNDI не настроено 3119 [main] DEBUG org.hibernate.internal.SessionFactoryImpl — созданный экземпляр SessionFactory 3176 [основная] DEBUG org.hibernate.stat.internal.StatisticsInitiator — статистика инициализирована [enabled=false] 3333 [основная] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory — создание общего экземпляра одноэлементного bean-компонента «messageService» 3333 [основная] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory — создание общего экземпляра одноэлементного bean-компонента «txManager». 3402 [основная] ИНФОРМАЦИЯ com.cypherf.TestSpringApplication — Запуск приложения... 3409 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — Создание новой транзакции с именем [com.cypherf.repository.MessageRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 3409 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — открыт новый EntityManager [SessionImpl(1809269661)] для транзакции JPA 3409 [main] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl — при создании TransactionImpl JpaCompliance#isJpaTransactionComplianceEnabled == false 3409 [основная] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl - начать 3409 [основная] ОТЛАДКА com.cypherf.repository.MessageRepository — попытка сохранить сообщение [id: 0; текст:"Сообщение первое"] 3425 [основная] ОТЛАДКА org.hibernate.SQL - выбирать следующее значение для Message_SEQ Спящий режим: выбирать следующее значение для Message_SEQ 3425 [main] DEBUG org.hibernate.id.enhanced.SequenceStructure — получено значение последовательности: 1 3440 [основная] DEBUG org.hibernate.event.internal.AbstractSaveEventListener — сгенерированный идентификатор: 1, с использованием стратегии: org.hibernate.id.enhanced.SequenceStyleGenerator 3440 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — инициирование фиксации транзакции 3440 [main] DEBUG org.springframework.orm.jpa.JpaTransactionManager — фиксация транзакции JPA в EntityManager [SessionImpl(1809269661)] 3440 [main] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl — фиксация 3456 [main] DEBUG org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl — инициирование освобождения соединения JDBC из afterTransaction 3456 [main] DEBUG org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl — инициирование освобождения соединения JDBC из afterTransaction 3456 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — закрытие JPA EntityManager [SessionImpl(1809269661)] после транзакции 3456 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — Создание новой транзакции с именем [com.cypherf.repository.MessageRepository.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 3456 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — открыт новый EntityManager [SessionImpl(1553616699)] для транзакции JPA 3456 [main] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl — при создании TransactionImpl JpaCompliance#isJpaTransactionComplianceEnabled == false 3456 [основная] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl - начать 3456 [main] DEBUG com.cypherf.repository.MessageRepository — попытка сохранить сообщение [id: 0; текст:"Сообщение второе"] 3456 [основная] ОТЛАДКА org.hibernate.SQL - выбирать следующее значение для Message_SEQ Спящий режим: выбирать следующее значение для Message_SEQ 3456 [основная] DEBUG org.hibernate.id.enhanced.SequenceStructure — получено значение последовательности: 51 3456 [основная] DEBUG org.hibernate.event.internal.AbstractSaveEventListener — сгенерированный идентификатор: 2, с использованием стратегии: org.hibernate.id.enhanced.SequenceStyleGenerator 3456 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — инициирование фиксации транзакции 3456 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — фиксация транзакции JPA в EntityManager [SessionImpl(1553616699)] 3456 [основная] DEBUG org.hibernate.engine.transaction.internal.TransactionImpl — фиксация 3456 [main] DEBUG org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl — инициирование освобождения соединения JDBC из afterTransaction 3456 [main] DEBUG org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl — инициирование освобождения соединения JDBC из afterTransaction 3456 [основная] DEBUG org.springframework.orm.jpa.JpaTransactionManager — закрытие JPA EntityManager [SessionImpl(1553616699)] после транзакции 3456 [основная] ИНФОРМАЦИЯ com.cypherf.service.MessageService - MessageService.printAllMessages() 3456 [основная] DEBUG org.hibernate.orm.query.hql - HQL: из сообщения 3724 [основная] ОТЛАДКА org.hibernate.orm.query.sqm.ast — Дерево SqmStatement: -> [выбрать] -> [спецификация запроса] -> [выбрать] -> [выбор] -> [корень] - `com.cypherf.model.Message(136820536837300)`
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Ошибка дублирующейся записи JPA в EntityManager.remove, а затем в EntityManager.persist
    Anonymous » » в форуме JAVA
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • EntityManager.persist() не работает с @Transactional
    Anonymous » » в форуме JAVA
    0 Ответы
    49 Просмотры
    Последнее сообщение Anonymous
  • EntityManager persist не сохраняет никаких данных
    Anonymous » » в форуме JAVA
    0 Ответы
    25 Просмотры
    Последнее сообщение Anonymous
  • EntityManager persist не сохраняет никаких данных
    Anonymous » » в форуме JAVA
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • EntityManager.persist(объект) NullPointerException
    Anonymous » » в форуме JAVA
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»