2013-09-15 2 views
2

У меня есть подключения к моей базе данных. Я могу выполнить следующие действия без какого-либо вопроса:Нет базы данных Выбранная стойкость JPA

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/people", "root", "r00t"); 

PreparedStatement statement = (PreparedStatement) conn.prepareStatement("select * from users"); 
ResultSet result = statement.executeQuery(); 

Однако, после установки JPA и настойчивый класса, я всегда получаю «Нет базы данных не Selected» ошибку. Мне не кажется, что мне нужно настроить мою конфигурацию базы данных (MySQL подключен к Glassfish 3.1), иначе приведенный выше код не сработает.

Вызов делается:

SELECT USERNAME, FIRSTNAME, LASTNAME, PASSWORD, PERMISSION FROM users 

Я попробовал этот вызов непосредственно в MySQL Workbench и он не работает.

Это один делает работу:

SELECT USERNAME, FIRSTNAME, LASTNAME, PASSWORD, PERMISSION FROM people.users 

Я играл круглые и не могу показаться, чтобы добавить имя базы данных в любом месте («люди»). Вот то, что я до сих пор:

Использование EclipseLink 2.0.x

JPA implimentation: Отключить конфигурации библиотеки

соединения: Локальный MySQL (я моя база данных успешно подключена)

схемы: люди

Из моего сервлета:

package com.lowe.samples; 

import java.io.IOException; 
import java.io.PrintWriter; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.mysql.jdbc.PreparedStatement; 

@WebServlet("/TestServlet") 
public class TestServlet extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    @PersistenceContext 
    private EntityManager em; 

    public TestServlet() { 
     super(); 
    } 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     PrintWriter out = response.getWriter(); 
     out.println("<h1>DataBase Test:<h1>"); 

     try { 

      Class.forName("com.mysql.jdbc.Driver"); 
      Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/people", "root", "r00t"); 

      PreparedStatement statement = (PreparedStatement) conn.prepareStatement("select * from users"); 
      ResultSet result = statement.executeQuery(); 

      // prep the table 
      out.print("<table border=\"5\">"); 
      out.print("<tr>"); 
      out.print("<td>UserName</td>"); 
      out.print("<td>FirstName</td>"); 
      out.print("<td>LastName</td>"); 
      out.print("<td>Password</td>"); 
      out.print("<td>Permission</td>"); 
      out.print("</tr>"); 

      while(result.next()) { 
       out.print("<tr>"); 
       out.print("<td>" + result.getString(1) + "</td>"); 
       out.print("<td>" + result.getString(2) + "</td>"); 
       out.print("<td>" + result.getString(3) + "</td>"); 
       out.print("<td>" + result.getString(4) + "</td>"); 
       out.print("<td>" + result.getString(5) + "</td>"); 
       out.print("</tr>"); 
      } 

      out.print("</table>"); 

      User u = (User)this.em.createNamedQuery("User.findAll").getResultList(); 
      out.print("User Name: " + u.getFirstName()); 

     } catch (ClassNotFoundException e) { 
      out.print("<h4>" + e.getMessage() + "</h4>"); 
      e.printStackTrace(); 
     } catch (SQLException e) { 
      out.print("<h4>" + e.getMessage() + "</h4>"); 
      e.printStackTrace(); 
     } 
    } 

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    } 

} 

Мой класс настойчивость:

package com.lowe.samples; 

import java.io.Serializable; 
import javax.persistence.*; 


/** 
* The persistent class for the users database table. 
*/ 
@Entity 
@Table(name="users") 
@NamedQuery(name="User.findAll", query="SELECT u FROM User u") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    private String userName; 

    private String firstName; 

    private String permission; 

    private String lastName; 

    private String password; 

    public User() { 
    } 

    public String getUserName() { 
     return this.userName; 
    } 

    public void setUserName(String userName) { 
     this.userName = userName; 
    } 

    public String getFirstName() { 
     return this.firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getPermission() { 
     return this.permission; 
    } 

    public void setPermission(String permission) { 
     this.permission = permission; 
    } 

    public String getLastName() { 
     return this.lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getPassword() { 
     return this.password; 
    } 

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

} 

persistence.xml

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.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_2_0.xsd"> 
    <persistence-unit name="MyFriends"> 
     <jta-data-source>jdbc/MySQLDataSource</jta-data-source> 
     <class>com.lowe.samples.User</class> 
    </persistence-unit> 
</persistence> 
+0

Почему вы используете jdbc? – nachokk

+0

@nachokk Я не следую. В отличие от? – maffo

+0

, если вы используете jpa, вы делегируете эту работу поставщику, который вы используете. В вашем случае добавить. [jpa или jdbc] (http://stackoverflow.com/questions/11881548/jpa-or-jdbc-how-are-they-different) – nachokk

ответ

4

Первая часть кода использует JDBC, чтобы загрузить драйвер базы данных, подключение и выполнить запрос. Тот факт, что он работает, показывает, что у вас есть драйвер MySQL в вашем пути к классам, и что вы можете подключиться к своей базе данных, используя URL и учетные данные. Это не имеет никакого отношения к JPA.

Ваш persistent.xml имеет единица сохранения имени «MyFriends» с JTA осведомленном источника данных, настроенного:

<jta-data-source>jdbc/MySQLDataSource</jta-data-source>

Этот источник данных, связанный с JNDI.

В соответствии с ошибкой вы получаете пул подключений неправильно сконфигурирован, вероятно, не хватает имени базы данных в URL-адресе.

+2

Я нашел проблему. После прочтения этой [awesome] ссылки я обнаружил, что в моем URL-адресе отсутствует имя DB. Url: jdbc: mysql: //: 3306 /, а не Url: jdbc: mysql: //: 3306/test. – maffo

+1

FYI my Glassfish 3.1 консоль администратора имеет два разных свойства: «URL» и «URL». Не могу себе представить, почему это имеет смысл, но у меня была эта проблема, потому что я только изменил первый, чтобы включить имя базы данных, и мне пришлось изменить их оба. –

0

Если вы используете источник данных jta или используете свойства hibernate, указав db url, укажите имя db после ip-адреса db, например jdbc: mysql: //: 3306 /. Если каким-то образом это невозможно для вас в ваших сущностях, вы можете указать db, в котором ваша таблица @Table(name="abcd",catalog="dbname/schema name") Вы также можете сделать это, если используете несколько баз данных с одного сервера.

0

если вы используете hbm.xml попробуйте следующее

<class name="com.javapapers.data.user" table ="user" catalog 
="<DBNAME.Schema>">