EclipseLink 初始化中的 NullPointerException

NullPointerException in EclipseLink initialization

我正在使用 Maven 存储库中的 Eclipselink 2.6.0-RC2 并尝试继承。

我有下面的 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) {
    }
}

对于上述配置,FooProjectBarProject 中的 main 均失败并出现以下异常

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 描述,那么 FooProject 上的 main 不会失败,反之亦然。

我曾尝试删除 Project 中的 abstract 并为其分配一个 @DiscriminatorValue,但它不起作用。

如果 main 放在 Project 中,它也不会起作用。

我使用的注释是否有任何错误导致它无法正常工作?

从实体中删除对 EntityManagerFactoryEntityManager 的引用,将其与 main() 方法一起移动到一些新的 class 并重试。

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