Hibernate Tapestry@CommitAfter位于页面外的方法上

Hibernate Tapestry@CommitAfter位于页面外的方法上,hibernate,tapestry,Hibernate,Tapestry,我试图在专用DAO类中执行页面之外的数据库事务 答案有一点帮助,但是在遵循关于事务的说明之后,仍然没有提交事务。我没有收到任何错误-我可以看到正在运行insert查询,但数据库中没有显示任何条目 DAO类和接口是否必须在特定的包中才能被@Match()找到?这是唯一能引起我所想到的问题的东西 以下是所有(我希望)相关代码: 应用模块 public static void bind(ServiceBinder binder) { binder.bind(MemberDAOInterface

我试图在专用DAO类中执行页面之外的数据库事务

答案有一点帮助,但是在遵循关于事务的说明之后,仍然没有提交事务。我没有收到任何错误-我可以看到正在运行insert查询,但数据库中没有显示任何条目

DAO类和接口是否必须在特定的包中才能被
@Match()
找到?这是唯一能引起我所想到的问题的东西

以下是所有(我希望)相关代码:

应用模块

public static void bind(ServiceBinder binder) {
    binder.bind(MemberDAOInterface.class, MemberDAO.class);
}

@Match("*DAO*")
public static void adviseTransactions(HibernateTransactionAdvisor advisor,
        MethodAdviceReceiver receiver) {
    advisor.addTransactionCommitAdvice(receiver);
}
MemberDao接口

public interface MemberDAOInterface {
    @CommitAfter
    public void addMember(MemberEntity memberEntity);

    @CommitAfter
    public void updateMember(MemberEntity memberEntity);

    @CommitAfter
    public void deleteMember(MemberEntity memberEntity);
}
MemberDAO

public class MemberDAO implements MemberDAOInterface {
    @Inject
    private Session session;

    public void addMember(MemberEntity memberEntity) {
        this.session.persist(memberEntity);
    }

    public void updateMember(MemberEntity memberEntity) {
        this.session.update(memberEntity);
    }

    public void deleteMember(MemberEntity memberEntity) {
        this.session.delete(memberEntity);
    }
}

关于你的这个问题:

DAO类和接口是否必须在特定的包中,@Match()才能找到它们

我在你提到的问题中发现:

默认情况下,@CommitAfter注释仅适用于页面/组件类。要在服务对象中获得相同的行为,您需要额外的一段代码

所以是的,您的DAO必须是tapestry服务。你需要把他们放在服务包中


希望这能有所帮助。

我没有看到任何明显的问题-我会先尝试在HibernateTransactionAdvisor周围放置一些日志记录/断点,看看是否有人调用它。对不起,我的错。。。很明显,您已经将dao作为服务进行了绑定。请放弃我的回答。