在SpringMVCWeb应用程序中,试图调用“persist”方法将实体模型保存到数据库时,我遇到了这个错误。在internet上找不到任何与此特定错误相关的帖子或页面。看起来EntityManagerFactoryBean有点问题,但我对Spring编程相当陌生,所以对我来说,根据web上的各种教程文章,似乎一切都初始化得很好。
调度器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>
注册控制器。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";
}
}
这个错误让我困惑了三天,我所面临的情况也产生了同样的错误。按照我能找到的所有建议,我对配置进行了调整,但没有效果。
最终我发现了它,不同之处在于,我正在执行的服务包含在一个公共jar中,问题是AspectJ没有对服务实例化进行相同的处理。实际上,代理只是简单地调用底层方法,而没有在方法调用之前执行所有正常的Spring魔术。
最后,根据示例在服务上放置的@Scope注释解决了问题:
@Service
@Scope(proxyMode = ScopedProxyMode.INTERFACES)
@Transactional
public class CoreServiceImpl implements CoreService {
@PersistenceContext
protected EntityManager entityManager;
@Override
public final <T extends AbstractEntity> int deleteAll(Class<T> clazz) {
CriteriaDelete<T> criteriaDelete = entityManager.getCriteriaBuilder().createCriteriaDelete(clazz);
criteriaDelete.from(clazz);
return entityManager.createQuery(criteriaDelete).executeUpdate();
}
}
我发布的方法是一个删除方法,但是注释以同样的方式影响所有持久性方法。
我希望这篇文章能帮助那些在从jar加载服务时遇到同样问题的人
我在spring数据存储库中尝试使用deleteBy自定义方法时遇到此异常。尝试从JUnit测试类执行该操作。
在JUnit类级别使用@Transactional
注释时不会发生异常。
我也遇到了同样的问题,我将该方法注释为@Transactional
,它成功了。
UPDATE:检查Spring留档默认情况下看起来PeristextContext是Transaction类型的,所以这就是为什么方法必须是事务性的(http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html):
@PeristextContext批注有一个可选的属性类型,默认值为PeristextContextType。交易。此默认值是接收共享EntityManager代理所需的值。另一种选择是PeristextContextType。EXTENDED是完全不同的事情:这会导致所谓的扩展实体管理器,它不是线程安全的,因此不能在并发访问的组件中使用,例如Spring管理的单例bean。扩展的实体管理器应该只在有状态组件中使用,例如,驻留在会话中,实体管理器的生命周期不与当前事务绑定,而是完全取决于应用程序。
我想发出POST请求以将用户保存到我的Oracle DB中。 我在jpa和hibernate中使用Spring MVC。 这是我的jpaContext.xml 这是我的UserRepoImpl类: 这是UserServiceImpl类: 这是来自REST控制器的方法: 我在服务图层上有注释。我尝试了许多在线找到的解决方案,使用存储库层上的@Transactional,或者使用@Scope(prox
问题内容: 当尝试调用“ persist”方法将实体模型保存到Spring MVC Web应用程序中的数据库时,出现此错误。在Internet上找不到与该特定错误相关的任何帖子或页面。似乎似乎EntityManagerFactory bean出了点问题,但是我对Spring编程还是比较陌生,所以对我来说,似乎一切都已初始化好,并且根据Web上的各种教程文章。 dispatcher-servlet.
尝试使用EntityManager时出错 我使用Spring(不是boot)、jpa和hibernate 有人能帮我吗? 实体课程 Spring配置类 在我得到的地方测试“刀” 使用find complete for error命令行 和我的主班 哦,我的朋友。xml 我在类和方法上使用了@Transactional,结果没有改变 请帮帮我,我已经做了所有的选择。
列出需要保存的数据。保存前必须删除现有数据并保存新数据。如果有任何删除 在这里,每次删除都会添加新事务 在删除时,它会引发异常“由以下原因引起:javax.persistence.TransactionRequiredException:没有具有实际事务的实体管理器可用于当前线程 - 无法可靠地处理'remove'调用” 我可以通过添加一个@ Transactional for public la
此错误发生在,当方法运行时。 向添加注释不能解决问题-https://stackoverflow.com/a/32552558/3536552 你知道怎么修吗?
问题:原因异常。 代码: