gpt4 book ai didi

java - 使用 Hibernate 实现 Tapestry 服务

转载 作者:行者123 更新时间:2023-12-01 17:25:10 26 4
gpt4 key购买 nike

我说的是 T5、Java 1.7。

我找不到任何关于在 Tapestry 服务中使用 hibernate 的足够详细的教程。我需要的是创建可以独立处理 hibernate 的 Tapestry 服务。例如,这可以是调度程序服务。该服务将处理数据库中的一些对象及其状态,并在应用程序的后台工作。

问题是,如何正确地将其与Hibernate绑定(bind)?应该注入(inject) Hibernate 的哪个对象以在该服务中进行进一步的工作?

<小时/>

当前的方法是在此服务中注入(inject)一个 HibernateSessionSource 对象(通过服务的构造函数传递其实例),然后手动创建 session 、开始事务等。例如:

public synchronized void deleteJob(long id) {
Session session = hss.create();
JobItem job = (JobItem) session.get(JobItem.class, id);
if (job != null) {
Transaction tx = session.beginTransaction();
try {
session.delete(job);
tx.commit();
} catch (HibernateException e) {
tx.rollback();
} finally {
session.close();
}
}
}

它看起来很丑,不是Tapestry的风格。什么是明智的方法?

最佳答案

这个问题由两部分组成:

如何在 Tapestry 托管服务中使用 Hibernate?

您可以使用@Inject注释在您的服务中注入(inject)hibernate session :

@Inject
private Session session;

或作为构造函数参数:

public MyService buildMyService(Session session) {
return new MyAwsomeService(session);
}

然后你就可以在服务内部使用它了。该 session 由 Tapestry 作为每线程服务进行管理。它将在首次使用时打开,并在请求结束后关闭。

如何在 Tapestry 托管服务中使用 hibernate 事务?

您可以使用注入(inject)的 HibernateSessionManager 手动执行此操作:

@Inject
private HibernateSessionManager manager;

public void doSomeWork(Entity entity) {
try {
session.delete(entity);
manager.commit();
} catch (Exception e) {
manager.abort();
}
}

或者您可以使用 @CommitAfteradvise services 注释所有事务方法。使用HibernateTransactionAdvisor :

public interface MyService {

@CommitAfter
void doSomeWork(Entity entity);

}

public class MyTapestryModule {
@Match("*Service")
public void adviseTransactions(HibernateTransactionAdvisor advisor,
MethodAdviceReceiver receiver) {
advisor.addTransactionCommitAdvice(receiver);
}
}

或者你可以decorate sevices使用HibernateTransactionDecorator :

public class MyTapestryModule {
@Match("*Service")
public <T> T decorateTransactions(Class<T> serviceInterface,
T delegate,
String serviceId,
HibernateTransactionDecorator decorator) {
return decorator.build(serviceInterface, delegate, serviceId);
}
}

它是如何工作的。它将在方法调用之前启动新事务并尝试在方法调用之后提交。如果在方法调用期间发生任何错误,该事务将被回滚。

关于java - 使用 Hibernate 实现 Tapestry 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15550464/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com