我创建了一个包含数据库访问的Singleton-Bean。 EntityManager被注入为PersistenceContext,并且我已经创建了一些基本方法来持久化项目。简装-版本:
@Singleton
public class Database implements Serializable {
private static final long serialVersionUID = -349043798329818812L;
@PersistenceContext(name = "PUname")
private EntityManager em;
public EntityManager getEntityManager() {
return this.em;
}
...
}
有一个远程接口(外观)注入了这个Singleton,但是对于这个测试它不需要。
为了测试,我创建了一个JUnit-Test并通过以下方式获取容器:
@BeforeClass
public static void setUpClass() throws NamingException {
container = javax.ejb.embeddable.EJBContainer.createEJBContainer();
instance = (Database) container.getContext().lookup("java:global/classes/Database");
}
当我现在尝试存储我的实体时,它适用于大多数实体, 但对于某些人来说,所有的操作都是
instance.getEntityManager().persist(entity);
抛出NullPointerException,因为EntityManager为空。
我不明白为什么,因为它对大多数人来说都很好。
实体都具有相同的基础,因为它们来自我的AbstractEntity:
@MappedSuperclass
public abstract class AbstractEntity implements Serializable{
private static final long serialVersionUID = -5790226883892406345L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String uuid;
...
}
Entites都有serialUUID和@Entity注释。
这让我发疯,我尝试了很多东西。我认为很奇怪,这些操作对我的大多数实体都很好,但是当我尝试为其他实体调用方法时,EntityManager没有正确注入。
EDIT01:我发现了一个名为" User"我可以打电话给em.persist(用户), 但是如果我在更改了某些值后尝试调用em.merge(user),我会得到EntityManager的NullPointerException。
我正在使用JDK 8中包含的GlassFish。
EDIT02:Stacktrace:
java.lang.NullPointerException
at zulu.votesapplication.logic.impl.Database.mergeUser(Database.java:311)
at zulu.votesapplication.logic.impl.DatabaseTest.testMergeUser(DatabaseTest.java:593)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
at org.apache.tools.ant.taskdefs.optional.junit.JUnit4TestMethodAdapter.run(JUnit4TestMethodAdapter.java:105)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:532)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1179)
at org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1030)
EDIT03: 我甚至试图运行" Clean and Build"在Netbeans,但这没有帮助。 我上次的GIT提交没有太多变化,我检查了大约10次。没有什么可以制造麻烦(我甚至在当地还原它们)。
最后,我在另一个地方检查了最后一次提交并将更改放在那里:现在它似乎工作正常。所以我认为IDE或GIT-Bash以某种方式搞砸了我的项目,但我没有找到问题。