EntityManager NullPointerException,因为它没有为某些操作

时间:2015-10-27 20:07:59

标签: java-ee jpa junit entitymanager

我创建了一个包含数据库访问的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以某种方式搞砸了我的项目,但我没有找到问题。

0 个答案:

没有答案