Я получаю эту ошибку при попытке вызвать метод «persist» для сохранения модели сущности в базе данных в моем веб-приложении Spring MVC. Не могу найти ни одного сообщения или страницы в Интернете, которые могут иметь отношение к этой конкретной ошибке. Кажется, что-то не так с bean-компонентом EntityManagerFactory, но я новичок в программировании на Spring, поэтому мне кажется, что все инициализировано нормально и согласно различным учебным статьям в Интернете.
диспетчер-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jpa="http://www.springframework.org/schema/data/jpa"
xsi:schemaLocation="
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
http://www.springframework.org/schema/data/jpa
http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
http://www.springframework.org/schema/data/repository
http://www.springframework.org/schema/data/repository/spring-repository-1.5.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.2.xsd">
<context:component-scan base-package="wymysl.Controllers" />
<jpa:repositories base-package="wymysl.repositories"/>
<context:component-scan base-package="wymysl.beans" />
<context:component-scan base-package="wymysl.Validators" />
<bean
class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.orm.hibernate4.HibernateExceptionTranslator"/>
<bean id="passwordValidator" class="wymysl.Validators.PasswordValidator"></bean>
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="system" />
<property name="password" value="polskabieda1" />
</bean>
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:./META-INF/persistence.xml" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="databasePlatform" value="org.hibernate.dialect.H2Dialect" />
<property name="showSql" value="true" />
<property name="generateDdl" value="false" />
</bean>
</property>
<property name="jpaProperties">
<props>
<prop key="hibernate.max_fetch_depth">3</prop>
<prop key="hibernate.jdbc.fetch_size">50</prop>
<prop key="hibernate.jdbc.batch_size">10</prop>
</props>
</property>
</bean>
<mvc:annotation-driven />
<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
</bean>
<bean name="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/jsp/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<mvc:resources mapping="/resources/**" location="/resources/" />
<mvc:resources mapping="/resources/*" location="/resources/css/"
cache-period="31556926"/>
</beans>
RegisterController.java
@Controller
public class RegisterController {
@PersistenceContext
EntityManager entityManager;
@Autowired
PasswordValidator passwordValidator;
@InitBinder
private void initBinder(WebDataBinder binder) {
binder.setValidator(passwordValidator);
}
@RequestMapping(value = "/addUser", method = RequestMethod.GET)
public String register(Person person) {
return "register";
}
@RequestMapping(value = "/addUser", method = RequestMethod.POST)
public String register(@ModelAttribute("person") @Valid @Validated Person person, BindingResult result) {
if(result.hasErrors()) {
return "register";
} else {
entityManager.persist(person);
return "index";
}
}
java
spring
spring-mvc
web-applications
Михал Бил
источник
источник
@Transaction
.Ответы:
У меня была та же проблема, и я аннотировал метод,
@Transactional
и он сработал.ОБНОВЛЕНИЕ: проверка документации Spring, похоже, что по умолчанию PersistenceContext имеет тип Transaction, поэтому метод должен быть транзакционным ( http://docs.spring.io/spring/docs/current/spring-framework-reference/ html / orm.html ):
источник
@Transactional
аннотации вызывает метод с@Transactional
аннотацией в том же файле класса, вы также столкнетесь с этой ошибкой (с чем я столкнулся).@Transactional
, что тоже работает. Не уверен, что это правильный путь, но похоже, что он работает нормально ...Я получил это исключение при попытке использовать специальный метод deleteBy в репозитории данных Spring. Попытка выполнить операцию из тестового класса JUnit.
Исключение не возникает при использовании
@Transactional
аннотации на уровне класса JUnit.источник
@Transactional
на уровне класса может маскировать возможные проблемы тестирования, которые управляют различными транзакциями в ваших сервисах.@Trasactional
метод репозитория, так как это место, где я действительно взаимодействую с базой данных, и она отлично работает.Эта ошибка меня обманывала в течение трех дней, ситуация, с которой я столкнулся, вызвала ту же ошибку. Следуя всем советам, которые я смог найти, я поигрался с конфигурацией, но безрезультатно.
В конце концов я нашел это, разница, Служба, которую я выполнял, содержалась в общей банке, проблема оказалась в том, что AspectJ не обрабатывает экземпляр Службы одинаково. По сути, прокси просто вызывал базовый метод без выполнения всей обычной магии Spring перед вызовом метода.
В конце концов, аннотация @Scope, размещенная на сервисе в соответствии с примером, решила проблему:
Опубликованный мной метод - это метод удаления, но аннотации одинаково влияют на все методы сохранения.
Надеюсь, этот пост поможет кому-то еще, кто боролся с той же проблемой при загрузке службы из банки.
источник
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
к классу DAO, реализующему интерфейс, действительно важно. Я потратил целый день, чтобы выяснить эту ошибку, и ваше решение - единственное, что работает. Большое спасибо!У меня была такая же ошибка, потому что я переключился с XML- на java-конфигурацию.
Дело в том, что я не переносил
<tx:annotation-driven/>
тег, как предложил Стоун Фэн.Поэтому я просто добавил,
@EnableTransactionManagement
как было предложено здесь, Настройка транзакций, управляемых аннотациями, в Spring в классе @Configuration , и теперь он работаетисточник
boardRepo.deleteByBoardId (ID);
Столкнулся с той же проблемой. GOT javax.persistence.TransactionRequiredException: нет EntityManager с фактической транзакцией, доступной для текущего потока
Я решил это, добавив аннотацию @Transactional над контроллером / службой.
источник
У меня была такая же проблема , и я добавил
tx:annotation-driven
вapplicationContext.xml
и это сработало.источник
У меня была такая же ошибка при доступе к уже аннотированному транзакционному методу из нетранзакционного метода в том же компоненте:
Я исправил ошибку, вызвав executeQuery () в компоненте с собственной ссылкой:
источник
Добавление
org.springframework.transaction.annotation.Transactional
аннотации на уровне класса для тестового класса устранило проблему для меня.источник
Просто примечание для других пользователей, ищущих ответы на воровскую ошибку. Еще одна распространенная проблема:
(Есть способы и средства использования AspectJ, но рефакторинг будет намного проще)
Итак, вам понадобятся вызывающий класс и класс, содержащий
@transactional
методы.источник
Для нас проблема заключалась в одинаковых настройках контекста в нескольких файлах конфигурации. Убедитесь, что вы не дублировали следующее в нескольких файлах конфигурации.
источник
У меня был тот же код ошибки, когда я использовал
@Transaction
неправильный метод / уровень действия.Конечно, мне пришлось разместить его
@Transactional
чуть выше методаmethodWithANumberOfDatabaseActions()
.Это решило сообщение об ошибке в моем случае.
источник
Я удалил режим из
заставить эту работу
источник
У меня была эта проблема в течение нескольких дней, и ничего, что я нашел в Интернете, мне не помогло, я отправляю свой ответ здесь на случай, если это поможет кому-то еще.
В моем случае я работал над микросервисом, который вызывается через удаленное взаимодействие, и моя аннотация @Transactional на уровне сервиса не принималась удаленным прокси.
Добавление класса делегата между слоями сервиса и dao и маркировка метода делегата как транзакционного исправило это для меня.
источник
Это помогло нам, может быть, это поможет другим в будущем.
@Transaction
у нас не работал, но это сработало:@ConditionalOnMissingClass("org.springframework.orm.jpa.JpaTransactionManager")
источник
Если у вас есть
и супер-класс
и ты звонишь
вы не получите Spring TransactionInterceptor (который дает вам транзакцию).
Вот что вам нужно сделать:
Невероятно, но факт.
источник