将Hibernate Ejb3Configuration与容器管理结合使用

时间:2011-06-03 16:10:41

标签: hibernate glassfish ejb java-ee-6

有没有办法使用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文件中的标记替换为类,它确实按预期调用...只是出现上面列出的问题=)

任何想法都将不胜感激!

2 个答案:

答案 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();

你可以通过反思在内部进行改变,但这并不是一种“好”的方式。