2012-03-29 5 views
7

Ich habe Auto und Vermietung Modelle conntected OneToMany Beziehung:Spring MVC mit Hibernate - OneToMany Mapping in Form

@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; 
} 
... 
} 

Und ich will bei Vermietung Schaffung Auto setzen:

<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-Tag zeigt korrekt verfügbare Autos an, aber nach dem Senden ist die Car-Instanz-Variable von Rental 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"; 
} 
} 

Was ist los?

Antwort

8

Sie sollten einen Service Layer in dich Anwendung

Zum Beispiel implementieren:

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

Umsetzung:

@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"; 
} 
+0

Ich dachte, dass es durch View-Schicht mit JSTL bedient werden können. Es ist eine Art Workaround, aber es funktioniert – bontade

Verwandte Themen