Spring MVC with Hibernate - Displaying OneToMany in Form

I have car and rental models related to the OneToMany attitude:

@Entity public class Rental { private Long id; private Car car; private User user; @Id @GeneratedValue @Column(name = "RENTAL_ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "CAR_ID") public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name = "USER_ID") public User getUser() { return user; } public void setUser(User user) { this.user = user; } } @Entity public class Car { private Long id; private String name; private String description; @Id @GeneratedValue @Column(name = "CAR_ID") public Long getId() { return id; } public void setId(Long id) { this.id = id; } ... } 

And I want to install a car while creating a rental:

 <form:form method="POST" commandName="rental"> <form:errors path="*" cssClass="errorblock" element="div" /> <table cellspacing="10"> <tr> <td>Car</td> <td> <form:select path="car" multiple="false" items="${cars}" itemLabel="name" itemValue="id"/></td> </tr> <tr> <td colspan="2"><input type="submit" value="Create"></td> </tr> </table> 

Form: select a tag that displays the correct available cars, but after sending the Car instance variable, the Rental section says null.

 @Controller @RequestMapping("/make-rental.htm") public class MakeRentalController { private CarDAO carDAO; private UserDAO userDAO; private RentalDAO rentalDAO; @Autowired public void setCarDAO(CarDAO carDAO) { this.carDAO = carDAO; } @Autowired public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } @Autowired public void setRentalDAO(RentalDAO rentalDAO) { this.rentalDAO = rentalDAO; } @RequestMapping(method = RequestMethod.GET) public String initForm(ModelMap mapModel) { Rental rental = new Rental(); // command object mapModel.addAttribute("cars", carDAO.getAll()); mapModel.addAttribute("rental", rental); // return form view return "makeRentalFormView"; } @RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("rental") Rental rental, BindingResult result, SessionStatus status, HttpSession session) { Object userId = session.getAttribute("userId"); if (userId != null) { rental.setUser(userDAO.getById((Long) userId)); rentalDAO.save(rental); // clear the command object from the session status.setComplete(); } // form success return "redirect:/index.htm"; } } 

What's wrong?

+7
source share
2 answers

You must implement Service Layer in the application

For example:

 public interface RentalService { void addRental(Rental rental, Long userId, Long carId); } 

Implementation:

 @Service @Transactional class DefaultRentalService implement RentalService { @Autowired private CarDAO carDAO; @Autowired private UserDAO userDAO; @Autowired private RentalDAO rentalDAO; @Override void addRental(Rental rental, Long userId, Long carId) { User user = userDAO.getById(userId); Car car = carDAO.getById(carId); rental.setUser(user); rental.setCar(car); rentalDao.save(rental); } } 

HTML:

 <form:form method="POST" commandName="rental"> <form:errors path="*" cssClass="errorblock" element="div" /> <table cellspacing="10"> <tr> <td>Car</td> <td> <select name="carId" > <c:forEach items="${cars}" var="car"> <option value="${car.id}">${car.name} </c:forEach> </select> </td> </tr> <tr> <td colspan="2"><input type="submit" value="Create"></td> </tr> </table> 

Controller:

 @AutoWired private RentalService rentalService; // .. // .. @RequestMapping(method = RequestMethod.POST) public String processSubmit(@ModelAttribute("rental") Rental rental, @RequestParam Long carId, BindingResult result, SessionStatus status, HttpSession session) { Object userId = session.getAttribute("userId"); if (userId != null) { rentalService.add(rental, (Long)userId, carId); status.setComplete(); } // form success return "redirect:/index.htm"; } 
+8
source
0
source

All Articles