Hi people,
I have two simple classes with a one to many relation :
Code:@Entity public class Request extends AbstractEntity { @OneToMany(mappedBy="request", cascade= CascadeType.ALL) protected List<Message> messages; public Request() { messages = new ArrayList<Message>(); } public void addMessage(Message message) { message.setRequest(this); messages.add(message); } public List<Message> getMessages() { return messages; } public void setMessages(List<Message> messages) { for(Message message : messages) { addMessage(message); } } }Both extending the AbstractEntity that handles to PK stuff etc.Code:@Entity public class Message extends AbstractEntity { @ManyToOne protected Request request; public Request getRequest() { return request; } public void setRequest(Request request) { this.request = request; } }
I've got UT that checks that everything works :
That works great. My problem is that I created a form to create a new Request with a first message.Code:@Test public void iCanAddMessageToARequest() { Request request = getTestRequest(); Message msg = new Message(); msg.setContent("myContent"); msg.setSender("mySender"); request.addMessage(msg); Request otherRequest = requestDao.persist(request); assertNotNull(otherRequest.getMessages()); assertFalse(otherRequest.getMessages().isEmpty()); Message otherMsg = otherRequest.getMessages().get(0); assertEquals(otherMsg.getContent(), msg.getContent()); assertEquals(otherMsg.getSender(), msg.getSender()); assertNotNull(otherMsg.getCreatedAt()); }
The controller :
And the JSP :Code:@Controller public class RequestController { @Resource protected RequestDAO requestDao; @RequestMapping(value = "/", method = RequestMethod.GET) public String index(Locale locale, Model model) { model.addAttribute("listRequests", requestDao.findAll()); return "index"; } @RequestMapping(value = "/new", method = RequestMethod.GET) public String newForm(Model model) { model.addAttribute("request", new Request()); return "new"; } @RequestMapping(value = "/", method = RequestMethod.POST) public String create( @Valid @ModelAttribute("request") Request request, BindingResult requestBindingResult, Model model) throws IOException { if (requestBindingResult.hasErrors()) { return "new"; } requestDao.persist(request); model.addAttribute("listRequests", requestDao.findAll()); return "index"; } }
With all this stuff, both the Request AND the Message are created. But the link between the message and the request is not created properly by Spring. The request_id in the Message table stays empty.Code:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %> <%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %> <%@ page session="false" %> <html> <body> <spring:url value="/" var="formUrl" /> <form:form commandName="request" cssClass="form-horizontal" action="${formUrl}" enctype="multipart/form-data"> <fieldset> <div class="control-group"> <label class="control-label" for="messages0.content">Message :</label> <div class="controls"> <form:textarea path="messages[0].content" /> </div> </div> <div class="form-actions"> <button type="submit" class="btn btn-primary">Envoyer</button> <button class="btn">Annuler</button> </div> </fieldset> </form:form> </body> </html>
After some debugging, I understand that this line in the JSP "messages[0].content" results in request.getMessages().add(new Message()).
What can I do so that the link is properly made between the two ?
I tried the AutoPopulatingList but it only works with something like request.getMessages().get(index)
Help please :/


Reply With Quote