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) {
}
}
对于以上配置中,两个main
在FooProject
和BarProject
具有以下例外
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
描述然后main
在FooProject
不会失败,反之亦然。
我试过在Project
中删除abstract
,并指定它为@DiscriminatorValue
,但它不起作用。
如果main
被放置在Project
中,它永远不会工作。
在我使用的注释中是否有任何错误使其无法使用?
从实体中删除对EntityManagerFactory和EntityManager的引用,并将其与main()方法一起移动到一些新类中,然后重试。 –
@PredragMaric谢谢,它的工作。在该类的静态初始化程序中请求实体管理器是否是非法的?你知道为什么有一个实体经理本身工作,而另一个被删除? – kftse
为了持久化单元被初始化,所有实体必须被初始化和扫描。你的设置会干扰这一点,用PU初始化静态变量,我不会分析它为什么在一种情况下工作,而不是在另一种情况下工作,因为它只是错误的。在实体内部使用实体管理器被许多人(我包括在内)认为是反模式,但你会在网上找到它的公开辩论。自从它提供帮助后,我将发表评论作为答案。 –