JavaEE 5 中,使用EntityManager的find方法时,总是报NullPointerException!!!???

时间:2021-07-25 17:28:04
我在使用JavaEE 5 ,NetBean6.0.1多语言版本,GalssFish v2。

例如数据库有一个表User,有两个字段:name、password,再用NetBean生成了一个对应的User实体类,用NetBean为User实体类生成一个SessionBean。

在运行如下代码时总是报NullPointerException:

EntityManager em;
......
em.find(User.class, name);

感觉应该很简单,但不知怎么回事,总是出现这个异常。

请大家帮忙分析一下,非常谢谢!

13 个解决方案

#1


你把表名换一下看看,比如 T_User

#2


我知道User是专用的。我不是用的User,用的Users。

#3


EntityManager   em;
你用的JPA吗?
把管理类贴上来看看,最前面的10行就行

#4


我使用的依赖注入。

/////////////////
///实体类
/////////////////
@Entity
@Table(name = "USERS")
@NamedQueries({@NamedQuery(name = "Users.findByName", query = "SELECT u FROM Users u WHERE u.name = :name"), @NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password")})
public class Users implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "NAME", nullable = false)
    private String name;
    @Column(name = "PASSWORD", nullable = false)
    private String password;

    ......

    public Users(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

////////////////////////////////
////封装对Users实体的操作
////////////////////////////////
public class UserCRUD {

    @PersistenceContext
    private EntityManager em;

    public UserCRUD() {
    }

    ......

    //仅仅列出了find方法
    public Users find(String id) {
        return em.find(base.entities.Users.class, id);
    }
    ......
}

////////////////////////////////////
///用JUnit对UserCRUD类生成的测试类
////////////////////////////////////
public class UserCRUDTest {

    public UserCRUDTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    ......

    //仅仅列出了find方法
    /**
     * Test of find method, of class UserCRUD.
     */
    @Test
    public void find() {
        System.out.println("find");
        String id = "romeo";       //用户名romeo
        UserCRUD instance = new UserCRUD();
        Users expResult = null;
        Users result = instance.find(id);
        assertEquals(expResult, result);
        // TODO review the generated test code and remove the default call to fail.
        fail("The test case is a prototype.");
    }

    ......
}

#5


果然少了关键的一句话
@Transactional // 这个必须加上才行
public   class   UserCRUD   {

        @PersistenceContext
        private   EntityManager   em; 

#6


to:java2000_net

我再去试试。

@Transactional // 这个必须加上才行

我看很多教材没有这个语句呢?包括官方的文档。


#7


to:java2000_net 

还是不行呢?

我用的JavaEE中的JPA,不是Hibernate。@Transactional 似乎根本就没有这个标签!!!!

真的有点晕了!

#8


按有几个群,你不妨加进去,可以和大家一起讨论啊.........46986340,28039577,4804620                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
在那里看看有无能回答你的,谢谢,LZ,甭忘了给俺分哦,谢谢LZ

#9


@Transactional   
是Spring的东西,你不是让Spring管理你的EntityManager吗!呵呵!

#10


我直接用的JavaEE 5 中的JPA。

今天调通了,不过又遇到一点新问题。

SessionBean调用实体类,JSF Back Bean再调用SessionBean,这样没问题。

但是当我试图在SessionBean和实体类之间用一个中间的类进行隔离时,又出这个异常。

我估计是我对什么时候容器调用依赖注入没有搞清楚。

#11


我明白了,依赖注入不能在普通类中完成。

#12


结贴,谢谢java2000_net、hahe7788,谢谢大家

#13


真心请教楼主是怎么调通的!!!!!!!!我要被这问题折腾疯了

#1


你把表名换一下看看,比如 T_User

#2


我知道User是专用的。我不是用的User,用的Users。

#3


EntityManager   em;
你用的JPA吗?
把管理类贴上来看看,最前面的10行就行

#4


我使用的依赖注入。

/////////////////
///实体类
/////////////////
@Entity
@Table(name = "USERS")
@NamedQueries({@NamedQuery(name = "Users.findByName", query = "SELECT u FROM Users u WHERE u.name = :name"), @NamedQuery(name = "Users.findByPassword", query = "SELECT u FROM Users u WHERE u.password = :password")})
public class Users implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "NAME", nullable = false)
    private String name;
    @Column(name = "PASSWORD", nullable = false)
    private String password;

    ......

    public Users(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

////////////////////////////////
////封装对Users实体的操作
////////////////////////////////
public class UserCRUD {

    @PersistenceContext
    private EntityManager em;

    public UserCRUD() {
    }

    ......

    //仅仅列出了find方法
    public Users find(String id) {
        return em.find(base.entities.Users.class, id);
    }
    ......
}

////////////////////////////////////
///用JUnit对UserCRUD类生成的测试类
////////////////////////////////////
public class UserCRUDTest {

    public UserCRUDTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Before
    public void setUp() {
    }

    @After
    public void tearDown() {
    }

    ......

    //仅仅列出了find方法
    /**
     * Test of find method, of class UserCRUD.
     */
    @Test
    public void find() {
        System.out.println("find");
        String id = "romeo";       //用户名romeo
        UserCRUD instance = new UserCRUD();
        Users expResult = null;
        Users result = instance.find(id);
        assertEquals(expResult, result);
        // TODO review the generated test code and remove the default call to fail.
        fail("The test case is a prototype.");
    }

    ......
}

#5


果然少了关键的一句话
@Transactional // 这个必须加上才行
public   class   UserCRUD   {

        @PersistenceContext
        private   EntityManager   em; 

#6


to:java2000_net

我再去试试。

@Transactional // 这个必须加上才行

我看很多教材没有这个语句呢?包括官方的文档。


#7


to:java2000_net 

还是不行呢?

我用的JavaEE中的JPA,不是Hibernate。@Transactional 似乎根本就没有这个标签!!!!

真的有点晕了!

#8


按有几个群,你不妨加进去,可以和大家一起讨论啊.........46986340,28039577,4804620                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
在那里看看有无能回答你的,谢谢,LZ,甭忘了给俺分哦,谢谢LZ

#9


@Transactional   
是Spring的东西,你不是让Spring管理你的EntityManager吗!呵呵!

#10


我直接用的JavaEE 5 中的JPA。

今天调通了,不过又遇到一点新问题。

SessionBean调用实体类,JSF Back Bean再调用SessionBean,这样没问题。

但是当我试图在SessionBean和实体类之间用一个中间的类进行隔离时,又出这个异常。

我估计是我对什么时候容器调用依赖注入没有搞清楚。

#11


我明白了,依赖注入不能在普通类中完成。

#12


结贴,谢谢java2000_net、hahe7788,谢谢大家

#13


真心请教楼主是怎么调通的!!!!!!!!我要被这问题折腾疯了