Reputation: 88
I'm developping an airline management web application with Java EE, EJB & JPA (EclipseLink)
I'm having a trouble when i'm calling a method in the service layer from a servlet : The method don't do what expected without having any error.
The method is AddPassengerToFlight where i am trying to add a passenger to the passengers list that i have in the flight entity with a ManyToMany relationship.
This is the structure of the priject.
This is the Flight and The Passenger Entities whitout the getters and setters:
Flight:
public class Flight implements Serializable {
@Id
@GeneratedValue( strategy = GenerationType.AUTO )
private Integer id;
@Enumerated( EnumType.STRING )
private Cities depart;
@Enumerated( EnumType.STRING )
private Cities destination;
private String prix;
@Temporal( TemporalType.TIMESTAMP )
private Date date;
@ManyToMany( cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH } )
@JoinTable( name = "f_p_join", joinColumns = @JoinColumn( name = "flight_fk" ), inverseJoinColumns = @JoinColumn( name = "passenger_fk" ) )
private List<Passenger> passengers;
@OneToOne( )
@JoinColumn( name = "airplane_fk" )
private Plane airplane;
@OneToOne( )
@JoinColumn( name = "pilot_fk" )
private Pilot pilot;
}
Passenger:
public class Passenger implements Serializable {
@Id
@GeneratedValue( strategy = GenerationType.AUTO )
private Integer id;
private String nom;
private String prenom;
private String adresse;
private String telephone;
private String email;
@Enumerated( EnumType.STRING )
private FlightClass flightClass;
@ManyToMany( mappedBy = "passengers" )
private List<Flight> flights;
}
The PassenerService where i have the method :
public class PassengerService {
private static final String CHAMP_FLIGHT_ID = "flightId";
private static final String CHAMP_PASSENGER_ID = "passengerId";
private String resultat;
private Map<String, String> erreurs = new HashMap<String, String>();
private PassengerDao passengerDao;
private FlightDao flightDao;
private PilotDao pilotDao;
private PlaneDao planeDao;
public Map<String, String> getErreurs() {
return erreurs;
}
public String getResultat() {
return resultat;
}
public PassengerService( PassengerDao passengerDao, FlightDao flightDao, PilotDao pilotDao, PlaneDao planeDao ) {
this.passengerDao = passengerDao;
this.flightDao = flightDao;
this.pilotDao = pilotDao;
this.planeDao = planeDao;
}
public Passenger createPassenger( HttpServletRequest request ) {
//The createPassenger code
}
public List<Passenger> getAllPassengers() {
//The getAllPassengers Code
}
public void AddPassengerToFlight( HttpServletRequest request ) {
FlightService flightService = new FlightService( flightDao, planeDao, pilotDao );
String passengerId = request.getParameter( CHAMP_PASSENGER_ID );
String flightId = request.getParameter( CHAMP_FLIGHT_ID );
Passenger passenger = getPassengerById( passengerId );
Flight flight = flightService.getFlightById( flightId );
List<Passenger> pList = flight.getPassengers();
pList.add( passenger );
flight.setPassengers( pList );
passenger.getFlights().add( flight );
}
public Passenger getPassengerById( String passengerId ) {
Passenger passenger = passengerDao.getPassengerById( passengerId );
return passenger;
}
public void removePassenger( Passenger passenger ) {
//The removePassenger code
}
}
And this is the servlet AddPassengerToFlight
@WebServlet( "/AddPassengerToFlight" )
public class AddPassengerToFlight extends HttpServlet {
private static final String VUE_REDIRECT = "/airline/PassengerList";
private static final long serialVersionUID = 1L;
@EJB
FlightDao flightDao;
@EJB
PilotDao pilotDao;
@EJB
PlaneDao planeDao;
@EJB
PassengerDao passengerDao;
protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
IOException {
FlightService flightService = new FlightService( flightDao, planeDao, pilotDao );
PassengerService passengerService = new PassengerService( passengerDao, flightDao, pilotDao, planeDao );
List<Flight> flights = flightService.getAllFlights();
List<Passenger> passengers = passengerService.getAllPassengers();
request.setAttribute( "flights", flights );
request.setAttribute( "passengers", passengers );
this.getServletContext().getRequestDispatcher( VUE ).forward( request, response );
}
protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException,
IOException {
PassengerService passengerService = new PassengerService( passengerDao, flightDao, pilotDao, planeDao );
passengerService.AddPassengerToFlight( request );
response.sendRedirect( VUE_REDIRECT );
}
}
And this is the form AddPassengerToFlight (The JSP File)
<div class="container">
<h2>Adding Passenger To Flight</h2>
<br/><br/>
<form method="POST" action="AddPassengerToFlight">
<div class="form-group">
<h4>Flight :</h4>
<select name="flightId" class="selectpicker" data-live-search="true" data-width="100%">
<c:forEach items="${flights}" var="flight">
<option value="${flight.id}">
FROM <c:out value="${flight.depart}" /> TO <c:out value="${flight.destination}" /> AT <c:out value="${flight.date}" />
</option>
</c:forEach>
</select>
</div>
<div class="form-group">
<h4>Passenger :</h4>
<select name="passengerId" class="selectpicker" data-live-search="true" data-width="100%">
<c:forEach items="${passengers}" var="passenger">
<option value="${passenger.id}"><c:out value="${passenger.nom}" /></option>
</c:forEach>
</select>
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
</div>
When i click the button submit of the AddPassengerToFlight im redirected to the PassengerList But Nothing happens between the two entities (Flight and Passenger) and i have no error.
Can anyone figure out what i am doing wrong here ?
Upvotes: 1
Views: 139
Reputation: 3424
I Believe that your problem is that your PassengerService Class is a plain JAVA Class (I explain, is not an EJB Service)... thus, when you make the association between Passanger and Flight in that class, there is no JTA transaction running and your entities are in detach mode; so, any changes on them will never be persisted at the database.
You can try this quickly to see if I'm correct... Make your Service an EJB Class and inject the required DAOs through @EJB
annotation, from the Servlet inject your new EJB and then invoke the method: AddPassengerToFlight( HttpServletRequest request )
...
Upvotes: 1