在我发现tynamo和resteasy集成的过程中,我面临着一个保存数据的问题,我部分地解决了这个问题(所以我将部分地分享它;)。用户指南在这里:http://docs.codehaus.org/display/TYNAMO/tapestry-resteasy+guide
我写了一个rest服务,允许在我的系统用户中注册“用户”:
package com.myorg.mobile.pushup.rest;
//[...]
/**
* bla blah obfuscated pretty comments.
*
* @author jrrevy
*
*/
@Path("/user")
public class UserResource {
private Session session;
/**
* Constructeur du service
*
* @param session
* Hibernate session
*/
public UserResource(Session session) {
this.session = session;
}
/**
* Lecture de tous les utilisateurs
*
* @return une liste des utilisateurs existants
*/
@GET
@Produces("application/json")
public List<User> getAllDomains() {
return session.createCriteria(User.class).list();
}
/**
* Create User.
*
* @param user
* user to create
* @return a Web Response
*/
@POST
@PUT
@Produces({ "application/xml", "application/json" })
public Response createOrUpdate(User user) {
session.saveOrUpdate(user);
return Response.ok().build();
}对数据库的访问工作得很好(我让我的用户回来了,在日志中使用了一个saw INSERT INTO命令),但是这个服务永远不会持久化任何东西。事务似乎从未提交过。
我使用的是tapestry-model-hibernate和tapestry-resteasy的0.3.0版本:
<dependencies>
<dependency>
<groupId>org.tynamo</groupId>
<artifactId>tapestry-model-hibernate</artifactId>
<version>0.3.0</version>
</dependency>
<dependency>
<groupId>org.tynamo</groupId>
<artifactId>tapestry-resteasy</artifactId>
<version>0.3.0</version>
</dependency>
</dependencies>请看我上面的回答,如果你找到更好的方法,请告诉我。
发布于 2013-01-21 03:27:28
根据这个线程:http://osdir.com/ml/java-tynamo-user/2012-04/msg00005.html,这只是一个提交问题:)。
在标准上下文中,事务由调用服务的页面处理。在REST方法中,这项工作应该由服务本身完成。
实际上,这个想法是把你自动发现的REST服务变成一个真正的tapestry IOC服务。
1-将其从自动发现移开
将其移动到服务包中(或允许Tapestry绑定但不在rest自动发现包中的任何人):
在这篇文章中,
2-提取接口
提取接口,并将注释放在它+ CommitAfter上您想要处理事务的位置。
package com.myorg.mobile.pushup.services.user;
@Path("/user")
public interface IUserResource {
/**
* Lecture de tous les utilisateurs
*
* @return une List des utilisateurs existants
*/
@GET
@Produces("application/json")
List<User> getAllDomains();
/**
* Méthode d'enregistrement / MAJ d'un utilisateur.
*
* @param user
* l'utilisateur à créer
* @return
*/
@POST
@PUT
@Produces({ "application/xml", "application/json" })
@Consumes({ "application/xml", "application/json" })
@CommitAfter
Response registerOrUpdate(User user);
}删除实现上的批注
package com.myorg.mobile.pushup.services.user.impl;
public class HibernateUserResourceImpl implements IUserResource {
/* (non-Javadoc)
*/
public List<User> getAllDomains() {
return session.createCriteria(User.class).list();
}
/* (non-Javadoc)
*/
Response registerOrUpdate(User user);
session.saveOrUpdate(user);
return Response.ok().build();
}3-将其作为单例资源贡献
public class AppModule {
public static void bind(ServiceBinder binder) {
binder.bind(IUserResource.class, HibernateUserResourceImpl.class);
}
/**
* Contributions to the RESTeasy main Application, insert all your RESTeasy
* singletons services here.
*/
@Contribute(javax.ws.rs.core.Application.class)
public static void configureRestResources(Configuration<Object> singletons,
IUserResource userResource) {
singletons.add(userResource);
}
}4-告知注解方法它们是事务型的
public class AppModule {
@Match("*Resource*")
public static void adviseTransactionally(
HibernateTransactionAdvisor advisor, MethodAdviceReceiver receiver) {
advisor.addTransactionCommitAdvice(receiver);
}如果你更喜欢使用JPATransactionAdvision而不是Hibernate,你可以添加另一个依赖:
<dependency>
<groupId>org.tynamo</groupId>
<artifactId>tapestry-jpa-core</artifactId>
<version>2.0.1</version>
</dependency>5-结论
这个解决方案对我来说很有效,但据我所知,这实际上是唯一的方法。
Alejandro >如果你读过这几行,请告诉我是否有另一种(最短的)方法,我是对的:)
发布于 2016-07-13 16:31:59
您可以使用HibernateSessionManager实现(在tapestry-hibernate依赖中给出)来获取会话并立即提交数据,如下所示:
@Inject
HibernateSessionManager hibernateSessionManager;
public void saveOrUpdate(MyEntity instance) {
Session session = hibernateSessionManager.getSession();
session.saveOrUpdate(instance);
hibernateSessionManager.commit();
session.flush();
}在这里,您不能关闭会话。因为会话是共享的,如果你试图关闭会话,你可能会得到类似“休眠会话已关闭”的异常。
另外,事务在这里是共享的,所以您只能使用hibernateSessionManager中给出的commit()函数提交事务,而不知道当前的事务。
https://stackoverflow.com/questions/14428364
复制相似问题