【发布时间】:2015-10-15 22:42:31
【问题描述】:
我正在学习 JPA,并且一直在学习教程。
教程项目是一个简单的“航班预订”动态站点,带有 JPA 和 derby 数据库。
我有一个带有 @Entity 注释的乘客类和一个作为无状态本地 bean 的乘客服务类。乘客服务类有一个 getPassengers 方法,它执行“createQuery("SELECT p FROM PASSENGER p",Passenger.class);"返回的结果是一个乘客列表。
要调用此方法,我有一个 GetPassenger servlet,并将查询结果列表设置为 http 请求属性并将其分派到 jsp 视图文件。
问题是,当我使用 getPassengers 方法运行 servlet 时,返回的列表是空的,即使我确保数据库的乘客表中有多个条目。以下是我的代码。感谢任何帮助。
谢谢。
客舱:
package com.airline.models;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.*;
/**
* Entity implementation class for Entity: Passenger
*
*/
@Entity
public class Passenger implements Serializable {
@Override
public String toString() {
return "Passenger [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", dob=" + dob
+ ", gender=" + gender + ", flightclass=" + flightclass + "]";
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String firstName;
private String lastName;
@Temporal(TemporalType.DATE)
private Date dob;
@Enumerated(EnumType.STRING)
private Gender gender;
@Enumerated(EnumType.STRING)
private FlightClass flightclass;
PassengerService 类:
package com.airline.service;
import java.util.List;
import javax.ejb.LocalBean;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import com.airline.models.Flight;
import com.airline.models.Passenger;
/**
* Session Bean implementation class PassengerService
*/
@Stateless
@LocalBean
public class PassengerService {
/**
* Default constructor.
*/
public PassengerService() {
// TODO Auto-generated constructor stub
}
@PersistenceContext(unitName = "airline")
EntityManager em;
public void addPassenger(Passenger p) {
em.persist(p);
}
public List<Passenger> getPassengers() {
try{
TypedQuery<Passenger> query = em.createQuery("SELECT p FROM PASSENGER p", Passenger.class);
List<Passenger> pList = (List<Passenger>)query.getResultList();
return pList;
}
catch (Exception e)
{
System.out.println("Passenger not found");
return null;
}
}
}
GetPassenger servlet:
package com.airline.controllers;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.ejb.EJB;
import javax.print.attribute.standard.PrinterState;
import javax.servlet.RequestDispatcher;
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.airline.models.Flight;
import com.airline.models.Passenger;
import com.airline.service.FlightService;
import com.airline.service.PassengerService;
/**
* Servlet implementation class GetFlight
*/
@WebServlet("/GetPassenger")
public class GetPassenger extends HttpServlet {
private static final long serialVersionUID = 1L;
@EJB
PassengerService ps;
/**
* @see HttpServlet#HttpServlet()
*/
public GetPassenger() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
List<Passenger> pList = (List<Passenger>)ps.getPassengers();
request.setAttribute("Passenger_List", pList);
if(pList == null)
{
System.out.println("passenger list empty");
return;
}
RequestDispatcher view = request.getRequestDispatcher("WEB-INF/views/passenger_list.jsp");
view.forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
【问题讨论】:
-
当我说列表为空时,我的意思是在控制台上 public List
getPassengers() 下的 try catch 块打印出“找不到乘客”和 servlet 的 if (pList== null) 将乘客列表打印为空。 -
此外,这些类是我之前创建的 Flight、FlightService 和 GetFlight 的相同副本,它们执行完全相同的操作并从同一数据库不同的表中打印出航班列表。
-
唯一的区别是我使用的 FlightService:TypedQuery
fQuery = em.createNamedQuery("Flight.FindById", Flight.class);和@NamedQuery(name = "Flight.FindById", query = "SELECT f FROM Flight f WHERE f.id = :id") 结果正如预期的那样打印了航班列表。 -
当您最终进入 catch 块并打印“乘客列表为空”时,异常是什么?这可能是您的线索,因为即使没有结果,您也不应该得到异常。调试该块以查看异常是什么,或执行 e.printStackTrace()
-
引起:异常 [EclipseLink-0] (Eclipse Persistence Services - 2.6.0.payara-p1):org.eclipse.persistence.exceptions.JPQLException 异常描述:编译问题 [SELECT p FROM PASSENGER p]。 [14, 23] 抽象模式类型“PASSENGER”未知。 ——这很奇怪。在名为 PASSENGER 的数据库下没有架构,一切都在架构“航空公司”下...?