Vee*_*era 5 java persistence jdo persistence-manager
关于如何创建/使用JDO持久性管理器(PM,以下简称),我有两个问题.
比如,在Java Web应用程序中,如果我有10个实体,可以在逻辑上分组为2个组(例如,5个用户相关实体和5个业务相关实体)
Nam*_*ter 14
根据JDO文档,您可以PersistenceManagerFactory为每个数据存储创建一个.如果您使用JDO通过SQL访问数据库并且您有多个数据库,则PersistenceManagerFactory每个数据库需要一个(因为您需要在创建时指定JDBC URL,用户名和密码PersistenceManagerFactory).
对于简单的用例,您可以PersistenceManager在需要时创建一个并在finally子句中关闭它(请参阅持久性管理器文档).
如果您使用事务,并且更新实体的代码可以分布在多个方法或对象上,我建议创建PersistenceManager按需并将其存储在ThreadLocal(或请求范围的对象中,如果您使用Guice或Spring).这将确保执行更新的任何代码都参与当前事务.确保PersistenceManager在请求结束时关闭.
如果您只需要一个持久性管理器工厂,则可以执行以下操作:
public class Datastore {
private static PersistenceManagerFactory PMF;
private static final ThreadLocal<PersistenceManager> PER_THREAD_PM
= new ThreadLocal<PersistenceManager>();
public static void initialize() {
if (PMF != null) {
throw new IllegalStateException("initialize() already called");
}
PMF = JDOHelper.getPersistenceManagerFactory("jdo.properties");
}
public static PersistenceManager getPersistenceManager() {
PersistenceManager pm = PER_THREAD_PM.get();
if (pm == null) {
pm = PMF.getPersistenceManager();
PER_THREAD_PM.set(pm);
}
return pm;
}
public static void finishRequest() {
PersistenceManager pm = PER_THREAD_PM.get();
if (pm != null) {
PER_THREAD_PM.remove();
Transaction tx = pm.currentTransaction();
if (tx.isActive()) {
tx.rollback();
}
pm.close();
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何需要持久性管理器的代码都可以调用 Datastore.getPersistenceManager()
注意:为了回答您的问题,我使用了所有静态方法使其变得简单.如果我使用像Guice这样的依赖注入框架,我会将这些方法设置为非静态并绑定Datastore为Singleton.
你可以调用finishRequestServlet过滤器:
public class PersistenceManagerFilter implements javax.servlet.Filter {
public init(FilterConfig filterConfig) {
Datastore.initialize();
}
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
chain.doFilter(request, response);
} finally {
Datastore.finishRequest();
}
}
}
Run Code Online (Sandbox Code Playgroud)