|
看了看toplink-essentials-agent的代码,发现使用这个jpa的web app,对部署的要求挺高, 而且侵入性较高,有一个比较简单的方法来解决这个问题。
比如在tomcat中使用Toplink-essentials jpa的比较方便的办法,就是直接调用toplink-essentials-agent的Instrumentation premain方法, 传入2个null参数即可,这样对OneToOne的LazyLoad会有一些影响,这里是示范代码
spring's application-context.xml:
<bean id="persistenceManager" class="ip.es.utils.EsManagerFactoryBean">
<property name="premainClass" value="oracle.toplink.essentials.internal.ejb.cmp3.JavaSECMPInitializerAgent" />
<property name="persistenceUnit" value="pu1" />
<property name="propMap">
<map>
<entry key="toplink.jdbc.driver" value="${db0.xdbcp.driver-class}" />
<entry key="toplink.jdbc.url" value="${db0.xdbcp.driver-url}" />
<entry key="toplink.jdbc.user" value="${db0.user}" />
<entry key="toplink.jdbc.password" value="${db0.password}" />
</map>
</property>
</bean>
<bean id="dao" class="ip.es.dao.jpa.BaseDaoImpl" autowire="byType" />
// ----> spring's factory bean code piece:
public void afterPropertiesSet() throws Exception {
try {
Class cls = Class.forName(premainClass);
Method method = cls.getDeclaredMethod("premain", new Class[] {
String.class, Instrumentation.class });
method.invoke(null, new Object[] { null, null });
entityManagerFactory = Persistence.createEntityManagerFactory(
persistenceUnit, propMap);
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
注:createEntityManagerFactory的propMap参数会自动和META-INF/persistence.xml中的properties合并
jpa的文档的确是太少了 |
|