使用persistence.xml连接MySQL数据库。为什么EntityManager查询返回null?

时间:2014-05-25 18:46:58

标签: java mysql jpa entitymanager tomee

我使用Tomee 7.0 plus作为我的服务器。我使用persistence.xml使用jdbc:mysql驱动程序建立与在线MySQL数据库的连接。我正在使用从连接收到的EntityManager,并将其注入我的类UserManager,我正在运行查询。 我没有解决方案,为什么我的查询没有在我的数据库中访问我的实际表。我一直得到的错误是nullpointer。我的persistence.xml有问题吗?因为它似乎没有建立完整的连接...

我没有使用Maven,Spring或Hibernate。我在一个小组项目中,我正在尝试启动和运行这个数据库,并且非常感谢任何输入或想法为什么我的连接没有建立。

这是persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
       xmlns="http://java.sun.com/xml/ns/persistence"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
       http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">

  <persistence-unit name="UserService" transaction-type="JTA">
    <jta-data-source>userDataSource</jta-data-source>
    <class>edu.neumont.pro280.models.User</class>
    <properties>
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://mywebsite.com/trivitup" />
            <property name="javax.persistence.jdbc.user" value="trivitup" />
            <property name="javax.persistence.jdbc.password" value="password" />
    </properties>
  </persistence-unit>
</persistence>

我将连接注入到我的UserManager中,当我打印出currentUser时,我得到null。 这是我用来注入连接的UserManager类:

@Stateless
@LocalBean
public class UserManager {
    @PersistenceContext(unitName = "UserService")
    EntityManager em;

    public User findUserByUsername(String user) {
    System.out.println("User to find is: " + user);
    TypedQuery<User> query = em.createQuery(
            "SELECT u FROM User u WHERE u.username=:user", User.class);
    query.setParameter("user", user);

    List<User> userList = query.getResultList();
    User returnUser = null;
    System.out.println("list size: " + userList.size());
    if (userList.size() == 1) {
        for (User user1 : userList) {
            returnUser = user1;
        }
    }
    return returnUser;
}

我使用LoginServlet,如果成功检索到用户,将对用户进行身份验证。当我打印出currentUser的用户名时,我得到一个null。

protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        String username = (String) req.getParameter("username");
        String password = (String) req.getParameter("password");
        User currentUser = userManager.findUserByUsername(username);
        System.out.println("This is currentUser... "
                + currentUser.getUsername());

    }

感谢您的任何想法或帮助。

3 个答案:

答案 0 :(得分:0)

您的错误可能与您同时提供jta-data-source和显式网址属性有关。

我猜测会发生的事情是JPA正在使用JNDI中绑定到userDataSource的数据源,而不是persistence.xml中的属性指定的数据源。您应该仔细检查定义userDataSource数据源的方式,最好删除显式的URL /用户名/密码属性。

答案 1 :(得分:0)

所以,这个解决方案非常有趣,我仍然不了解所有这些。使用我的persistence.xml完全正确,这是连接到MySQL数据库所需的确切数据,但仍无法正常工作。为了解决这个nullpointer问题,我不得不从我的persistence.xml中提取资源元素并将其解压缩到另一个名为resources.xml的文档中,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<resources>
  <Resource id="userDataSource" type="DataSource">
   JdbcDriver com.mysql.jdbc.Driver
   JdbcUrl jdbc:mysql://mywebsite.com/trivitup
   UserName trivitup
   Password password
 </Resource>
</resources>

之后,我建立了数据库连接。

答案 2 :(得分:-1)

当Tomee启动时,您可以看到config JPA Persistence Unit的日志。如果没有关于此的日志,请确保您的META-INF目录位于根类路径。