2015-05-12 58 views
0

我使用Maven存储库中的Eclipselink 2.6.0-RC2并尝试继承。EclipseLink初始化中的NullPointerException

我有以下3类:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING, name = "CLASSNAME") 
public abstract class Project { 
    @Id 
    @Column(length = 50) 
    private String id; 
} 

@Entity 
@DiscriminatorValue(value = "Foo") 
public class FooProject extends Project { 
    private static EntityManagerFactory emf = Persistence 
     .createEntityManagerFactory("vasp"); 
    private static EntityManager em = emf.createEntityManager(); 


    public static void main(String[] args) { 
    } 
} 

@Entity 
@DiscriminatorValue(value = "Bar") 
public class BarProject extends Project { 
    private static EntityManagerFactory emf = Persistence 
     .createEntityManagerFactory("vasp"); 
    private static EntityManager em = emf.createEntityManager(); 

    public static void main(String[] args) { 
    } 
} 

对于以上配置中,两个mainFooProjectBarProject具有以下例外

Exception in thread "main" java.lang.ExceptionInInitializerError 
Caused by: javax.persistence.PersistenceException: java.lang.NullPointerException 
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:812) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:205) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:305) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:337) 
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:303) 

失败如果我上BarProject除去@Entity描述然后mainFooProject不会失败,反之亦然。

我试过在Project中删除abstract,并指定它为@DiscriminatorValue,但它不起作用。

如果main被放置在Project中,它永远不会工作。

在我使用的注释中是否有任何错误使其无法使用?

+2

从实体中删除对EntityManagerFactory和EntityManager的引用,并将其与main()方法一起移动到一些新类中,然后重试。 –

+0

@PredragMaric谢谢,它的工作。在该类的静态初始化程序中请求实体管理器是否是非法的?你知道为什么有一个实体经理本身工作,而另一个被删除? – kftse

+1

为了持久化单元被初始化,所有实体必须被初始化和扫描。你的设置会干扰这一点,用PU初始化静态变量,我不会分析它为什么在一种情况下工作,而不是在另一种情况下工作,因为它只是错误的。在实体内部使用实体管理器被许多人(我包括在内)认为是反模式,但你会在网上找到它的公开辩论。自从它提供帮助后,我将发表评论作为答案。 –

回答

2

从实体中删除对EntityManagerFactoryEntityManager的引用,将其与main()方法一起移至一些新类,然后重试。

为了使持久性单元初始化,必须初始化和扫描所有实体。你的设置会干扰这一点,用PU初始化静态变量,我不会分析它为什么在一种情况下工作,而不是在另一种情况下工作,因为它只是错误的。在实体内部使用实体管理器被许多人(我包括在内)认为是反模式,但你会在网上找到它的公开辩论。

相关问题