1

在我发现 tynamo 和 resteasy 集成时,我遇到了保存数据的问题,我部分解决了(所以我将部分分享它;))。用户指南在这里:http ://docs.codehaus.org/display/TYNAMO/tapestry-resteasy+guide

我写了一个休息服务,允许在我的系统用户中注册“用户”:

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();
    }

对数据库的访问效果很好(我让我的用户回来了,在日志中看到了 INSERT INTO 命令),但是这个服务永远不会持久化任何东西。似乎该事务从未提交。

我正在使用 0.3.0 版本的 Tapestry-model-hibernate 和 Tapestry-resteasy :

<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>

请参阅上面的答案,但如果您找到更好的方法,请告诉我。

4

2 回答 2

2

根据这个线程: http: //osdir.com/ml/java-tynamo-user/2012-04/msg00005.html,这只是一个提交问题:)。

在标准上下文中,事务由调用服务的页面处理。在 REST 方法中,这项工作应该由服务本身完成。

实际上,这个想法是将您的自动发现的 REST 服务更改为真正的挂毯 IOC 服务。

1 - 将其从自动发现中移开

将它移动到服务包(或任何允许 Tapestry 绑定而不是在休息自动发现包中):

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 one,则可以添加另一个依赖项:

    <dependency>
        <groupId>org.tynamo</groupId>
        <artifactId>tapestry-jpa-core</artifactId>
        <version>2.0.1</version>
    </dependency>

5 - 结论

这个解决方案对我有用,但据我了解,这实际上是唯一的方法。

Alejandro > 如果您阅读了这些行,请告诉我是否还有另一种(最短)方式,我是对的 :)

于 2013-01-20T19:27:28.060 回答
1

您可以使用 HibernateSessionManager 实现(在 Tapestry-hibernate 依赖项中给出)来获取会话并立即提交数据,如下所示,

@Inject 
HibernateSessionManager hibernateSessionManager;

public  void saveOrUpdate(MyEntity instance) {
    Session session = hibernateSessionManager.getSession();
    session.saveOrUpdate(instance);
    hibernateSessionManager.commit();
    session.flush();
}

在这里你不能关闭会话。因为会话是共享的,如果您尝试关闭会话,您可能会遇到“休眠会话已关闭”之类的异常。

这里也共享事务,因此您只能使用 hibernateSessionManager 中提供的 commit() 函数提交事务,而不知道当前事务。

于 2016-07-13T08:31:59.343 回答