有没有办法使用Ejb3Configuration提供的程序化配置和容器管理实体管理?我想在处理persistence.xml之后动态添加(附加)通过ServiceLoader发现的带注释的类。
我试图扩展HibernatePersistence覆盖createContainerEntityManagerFactory方法,在那里我添加了添加类的功能,但我发现了两个问题: 1)当我尝试在新的PersistenceProvider中调用EjbConfiguration实例configure(PersistenceUnitInfo,Map)方法时,我返回null。 2)我的应用服务器(GF 3.0.1和GF 3.1)在应用程序关闭时抛出NPE,源自org.glassfish.persistsnce.jpa.JPAApplicationContainer.closeAllEMFs或org.glassfish.persistence.jpa.JPADeployer.closeEMFs分别
以下是我的PersistenceProvider:
//left out createEntityManagerFactory for brevity
public class DynamicEntityProvider extends HibernatePersistence {
@Override
public EntityManagerFactory createContainerEntityManagerFactory
(PersistenceUnitInfo info, Map props) {
final Ejb3Configuration config = new Ejb3Configuration();
final Ejb3Configuration configured = config.configure(info, props);
if (configured != null) {
//never gets here, configured is always returned null
addDynamicEntities(configured);
return configured.buildEntityManagerFactory();
}
//logging code which notifies me that configured was null
return null;
}
//addDynamicEntities() method impl
我只是将persistence.xml文件中的标记替换为类,它确实按预期调用...只是出现上面列出的问题=)
任何想法都将不胜感激!
答案 0 :(得分:1)
它看起来像某种类加载器可见性问题。我知道GF使用OSGi捆绑,所以我并不完全惊讶。
如果没有发现info描述的持久性单元与正在进行的持久性提供程序匹配,则config.configure基本上返回null。尝试并显示信息,看看是否正确设置了持久性提供程序并监视类加载器问题(例如,如果CL加载它不同,则myClass!= yourClass)
答案 1 :(得分:1)
我不知道你是否已经解决了问题,但是......
它返回null,因为您正在扩展的HibernatePersistence类检查persistence.xml是否将提供程序设置为它而不是子类,因此它不会将您的类(DynamicEntityProvider)识别为提供程序,因此它不会解析你的xml。
if ( metadata.getProvider() == null || IMPLEMENTATION_NAME.equalsIgnoreCase(metadata.getProvider()) ) {
IMPLEMENTATION_NAME的位置
private static final String IMPLEMENTATION_NAME = HibernatePersistence.class.getName();
你可以通过反思在内部进行改变,但这并不是一种“好”的方式。