![](/img/trans.png)
[英]Hibernate JPA and Spring javax.persistence.TransactionRequiredException: no transaction is in progress
[英]Trying to Get JPA/Hibernate working with REST — TransactionRequiredException: No Transaction is in progress error
我一直在尝试让Hibernate / JPA与我简单的Spring 3.2 REST应用程序一起工作。
Hibernate / JPA在MySQL中成功创建了我的表,但是一旦事务进入存储库,事务就会失败-表示没有事务在进行中。 我真的不在这里,甚至不确定如何解决此问题,因为似乎大多数代码都发生在xml幕后。
任何帮助,不胜感激。 更新-jpaContext.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:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:annotation-config />
<context:component-scan base-package="com.saltcitywifi"></context:component-scan>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceUnitName" value="punit" />
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" >
<property name="showSql" value="true" />
</bean>
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<entry key="hibernate.hbm2ddl.auto" value="create" />
<entry key="hibernate.format_sql" value="true" />
</map>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/salt_city_wifi?autoReconnect=true" />
<property name="username" value="wifi_admin" />
<property name="password" value="password" />
</bean>
控制器:
@Controller
public class HotSpotController {
@Autowired
private HotSpotService hotSpotService;
@RequestMapping(value = "/hotSpots", method = RequestMethod.GET)
public @ResponseBody
List<HotSpot> getHotSpots() {
hotSpotService = new HotSpotServiceImpl();
List<HotSpot> spots = hotSpotService.getAllHotSpots();
return spots;
}
@RequestMapping(value = "/hotSpot", method = RequestMethod.POST)
public @ResponseBody
HotSpot addHotSpot(@RequestBody HotSpot hotSpot) {
hotSpotService.addHotSpot(hotSpot);
return hotSpot;
}
}
服务:
@Service("hotSpotService")
@Transactional
public class HotSpotServiceImpl implements HotSpotService {
@Autowired
private HotSpotRepository hotSpotRepository;
private AtomicLong counter = new AtomicLong();
public List<HotSpot> getAllHotSpots() {
List<HotSpot> spots = new ArrayList<HotSpot>();
HotSpot spot;
for (int i = 0; i < 10; i++) {
spot = new HotSpot("location " + i, "http://www.url" + i + ".com",
counter.incrementAndGet());
spots.add(spot);
}
return spots;
}
public HotSpot getHotSpotById(long id) {
HotSpot spot = new HotSpot("New Spot", "New Url", id);
return spot;
}
@Transactional
public HotSpot addHotSpot(HotSpot hotSpot) {
return hotSpotRepository.addHotSpot(hotSpot);
}
}
@Repository("hotSpotRepository")
public class HotSpotRepositoryImpl implements HotSpotRepository {
@PersistenceContext
private EntityManager em;
public HotSpot addHotSpot(HotSpot hotSpot) {
em.persist(hotSpot);
em.flush();
return hotSpot;
}
}
好了,我终于弄明白了这里发生了什么:
我有两个组件扫描程序,一个用于servlet-config.xml中的控制器,另一个用于jpaContext.xml中的JPA东西。
他们基本上都在扫描我的整个应用程序:
<context:component-scan base-package="com.saltcitywifi" />
当我强制控制器的组件扫描程序仅查看控制器软件包时:
<context:component-scan base-package="com.saltcitywifi.controller" />
突然我的请求开始工作并在数据库中得到处理。
我只能假定,因为我的servlet-config.xml配置仅包含:
<context:component-scan base-package="com.saltcitywifi.controller" />
<mvc:annotation-driven />
那个春天以某种方式让servlet-config.xml注册JPA bean,因此没有处理事务性注释。 这仍然让我感到困惑,因此,如果有人可以帮助解释为什么会这样,那将非常有帮助。 我可能会问这个问题的另一个堆栈溢出问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.