Tomcat上的Spring/JPA/Vaadin-非持久化实体
我有一个在Tomcat7服务器上使用StackSpring、JPA(HibernateImpl)和Vaadin7的webapp。问题是实体管理器没有持久化实体的。此外,不会引发任何错误/异常。我想我能得到答案,但我不确定 要使用带弹簧的Vaadin 7,我使用 由于文件数量有限,以下是概述:Tomcat上的Spring/JPA/Vaadin-非持久化实体,spring,tomcat,jpa,vaadin,Spring,Tomcat,Jpa,Vaadin,我有一个在Tomcat7服务器上使用StackSpring、JPA(HibernateImpl)和Vaadin7的webapp。问题是实体管理器没有持久化实体的。此外,不会引发任何错误/异常。我想我能得到答案,但我不确定 要使用带弹簧的Vaadin 7,我使用 由于文件数量有限,以下是概述: src/main/webapp/META-INF/context.xml src/main/webapp/WEB-INF/WEB.xml src/main/webapp/WEB-INF/applicati
- src/main/webapp/META-INF/context.xml
- src/main/webapp/WEB-INF/WEB.xml
- src/main/webapp/WEB-INF/application-context.xml
- src/main/java/com/ks/places/MyUI.java(自动连接placeService并创建PlaceEntity)
- src/main/java/com/ks/places/model/Place.java(相关实体)
- src/main/java/com/ks/places/dao/PlaceDao.java
- src/main/java/com/ks/places/dao/PlaceDaoImpl.java
- src/main/java/com/ks/places/service/PlaceService.java
- src/main/java/com/ks/places/service/PlaceServiceImpl.java
<!-- Spring -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/application-context.xml</param-value>
</context-param>
<!-- Vaadin servlet -->
<servlet>
<servlet-name>Vaadin Application Servlet</servlet-name>
<servlet-class>ru.xpoft.vaadin.SpringVaadinServlet</servlet-class>
<init-param>
<description>Vaadin UI to display</description>
<param-name>beanName</param-name>
<param-value>myUI</param-value>
</init-param>
<init-param>
<param-name>systemMessagesBeanName</param-name>
<param-value>DEFAULT</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Vaadin Application Servlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Vaadin Application Servlet</servlet-name>
<url-pattern>/VAADIN/*</url-pattern>
</servlet-mapping>
<!-- Vaadin Production/debug mode -->
<context-param>
<description>Vaadin production mode</description>
<param-name>productionMode</param-name>
<param-value>false</param-value>
</context-param>
<!-- JNDI datasource -->
<resource-ref>
<description>JNDI Datasource</description>
<res-ref-name>jdbc/placesPU</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
PlaceDaoImpl.java
@Repository("placeDao")
public class PlaceDaoImpl implements PlaceDao {
// @PersistenceContext(unitName="placesPU") // also tried this
private EntityManager entityManager;
public EntityManager getEntityManager() {
return entityManager;
}
@PersistenceContext(unitName="placesPU")
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
@Override
public void save(Place place) {
entityManager.persist(place);
entityManager.flush(); <- gives an TransactionRequiredException exception
}
}
PlaceServiceImpl.java
//@Transactional(propagation = Propagation.REQUIRED, readOnly = false) // also tried this
@Service("placeService")
public class PlaceServiceImpl implements PlaceService {
@Autowired
private PlaceDao placeDao;
//@Transactional // also tried this
@Transactional(propagation= Propagation.REQUIRED, readOnly=false)
@Override
public void save(Place place) {
placeDao.save(place);
}
}
MyUI.java
@Component
@Scope("prototype")
public class MyUI extends UI implements Serializable {
private static final long serialVersionUID = 1L;
@Autowired
private PlaceService placeService;
@Override
protected void init(VaadinRequest request) {
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);
Button button = new Button("Click Me");
button.addClickListener(new Button.ClickListener() {
private static final long serialVersionUID = 1L;
public void buttonClick(ClickEvent event) {
Place place = new Place();
place.setName("vandaag");
placeService.save(place);
// No entity was added to the database...
}
});
layout.addComponent(button);
}
}
交易
当我持久化Place实体(MyUI.java中的placeService.save())时,我没有得到任何错误或异常。但是,当我手动尝试刷新entityManager时,确实会出现错误:
Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:983)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366)
at $Proxy16.flush(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:241)
at $Proxy16.flush(Unknown Source)
at com.ks.places.dao.PlaceDaoImpl.save(PlaceDaoImpl.java:44)
例外情况清楚地表明,
@Transactional
注释根本不被考虑
我建议您从
中删除mode=“aspectj”
:
默认的模式
是代理
。对于aspectj
,您需要完整的aspectj支持(我目前看不出您需要它的原因)。AspectJ编织需要类路径上的spring-aspects.jar,以及启用加载时编织(或编译时编织)
(顺便说一句,您不需要代理target class=“true”,因为您有服务的接口。)例外情况清楚地表明,您的
@Transactional
注释根本不被考虑
我建议您从
中删除mode=“aspectj”
:
默认的模式
是代理
。对于aspectj
,您需要完整的aspectj支持(我目前看不出您需要它的原因)。AspectJ编织需要类路径上的spring-aspects.jar,以及启用加载时编织(或编译时编织)
(顺便说一句,您不需要代理target class=“true”,因为您有服务接口。)您可以复制/粘贴您的日志以检查您的交易是否正确吗?谢谢。我更新了这个问题,但有一个例外。或者您是指其他日志吗?能否复制/粘贴日志以检查您的交易是否正确?谢谢。我更新了这个问题,但有一个例外。或者你是说其他日志?你是对的。。。我不敢相信我没试过。一定是因为我用它挣扎了两天,看不清楚。你是对的。。。我不敢相信我没试过。一定是因为我用它挣扎了两天,看不清楚。
public interface PlaceService {
void save(Place place);
}
//@Transactional(propagation = Propagation.REQUIRED, readOnly = false) // also tried this
@Service("placeService")
public class PlaceServiceImpl implements PlaceService {
@Autowired
private PlaceDao placeDao;
//@Transactional // also tried this
@Transactional(propagation= Propagation.REQUIRED, readOnly=false)
@Override
public void save(Place place) {
placeDao.save(place);
}
}
@Component
@Scope("prototype")
public class MyUI extends UI implements Serializable {
private static final long serialVersionUID = 1L;
@Autowired
private PlaceService placeService;
@Override
protected void init(VaadinRequest request) {
final VerticalLayout layout = new VerticalLayout();
layout.setMargin(true);
setContent(layout);
Button button = new Button("Click Me");
button.addClickListener(new Button.ClickListener() {
private static final long serialVersionUID = 1L;
public void buttonClick(ClickEvent event) {
Place place = new Place();
place.setName("vandaag");
placeService.save(place);
// No entity was added to the database...
}
});
layout.addComponent(button);
}
}
Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:983)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366)
at $Proxy16.flush(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:241)
at $Proxy16.flush(Unknown Source)
at com.ks.places.dao.PlaceDaoImpl.save(PlaceDaoImpl.java:44)
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />