2017-07-01 49 views
0

我想在OneToMany关系中创建与特定Person相关的银行账户注册表。使用Spring MVC和Hibernate作为外​​键在JSP中发送对象

我有CLAS昂佩索阿(人):

@Entity 
public class Pessoa { 
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int idPessoa; 
    private String nome; 
    @OneToMany(mappedBy = "pessoa", targetEntity = ContaCorretora.class, fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<ContaCorretora> contaCorretora; 

...和类ContaCorretora(银行账户):

@Entity 
public class ContaCorretora { 
    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int idConta; 
    private TipoConta tipoConta; 
    private TipoRisco tipoRisco; 
    private String login; 
    private String senha; 
    private BigDecimal valorAtual; 
    @ManyToOne 
    @JoinColumn(name="idPessoa") 
    private Pessoa pessoa; 

我使用的控制器此方法用于启动注册过程:

@RequestMapping(value = "pessoacorretora/{id}") 
public ModelAndView pessoaCorretora(@PathVariable("id") int id, ContaCorretora contaCorretora) { 
    Map<String, Object> model = new HashMap<String, Object>(); 
    Pessoa pessoa = pessoaDao.find(id);  
    model.put("pessoa", pessoa); 
    model.put("tipoConta", TipoConta.values()); 
    model.put("tipoRisco", TipoRisco.values()); 
    return new ModelAndView("corretora/contacorretora", "model", model);   
} 

Sumarizining,我有一个记录银行账户的特定页面。所以,我创造了这个形式:

<form:form action="${s:mvcUrl('CC#gravar').build() }" method="post" commandName="contaCorretora" enctype="multipart/form-data" > 

    <div class="form-group" > 
     <label>Conta</label> 
     <select name="tipoConta"> 
      <c:forEach items="${model.tipoConta}" var="tipoConta"> 
        <option value=${tipoConta}>${tipoConta}</option> 
      </c:forEach> 
     </select> 
    </div> 

    <div class="form-group" > 
     <label>Risco</label> 
     <select name="tipoRisco"> 
      <c:forEach items="${model.tipoRisco}" var="tipoRisco"> 
        <option value=${tipoRisco}>${tipoRisco}</option> 
      </c:forEach> 
     </select> 
    </div> 

      <div class="form-group"> 
     <label>Login</label> 
     <form:input path="login" cssClass="form-control" /> 

    </div> 

    <div class="form-group"> 
     <label>Senha</label> 
     <form:input path="senha" cssClass="form-control" /> 

    </div> 

    <div class="form-group"> 
     <label>Valor Atual</label> 
     <form:input path="valorAtual" cssClass="form-control" /> 

    </div> 
    <form:hidden path="pessoa" cssClass="form-control" value="${pessoa}"/> 

     <button type="submit" class="btn btn-primary">Cadastrar</button> 
</form:form> 

当我使用的形式,这样一来,我收到错误消息“描述由客户端发送的请求是语法不正确。”我想通了,问题是出在这条线,因为当我删除,形式后确定:

<form:hidden path="pessoa" cssClass="form-control" value="${pessoa}"/> 

不过,如果我删除这条线,该程序不会在idPessoa保存为一个外键,这字段为空。我想知道如何在JSP表单中传递整个对象。后置方法是:

@RequestMapping(method=RequestMethod.POST) 
public ModelAndView gravar(ContaCorretora contaCorretora) {  
    contaCorretoraDao.gravar(contaCorretora); 
    return new ModelAndView("pessoa/listageral"); 
} 

所有的DAO的方法都没问题。

回答

0

您只需要将pessoa的主键发送到表单即可。 更改窗体属性

<form:hidden path="pessoa.idPessoa" cssClass="form-control" value="${model.pessoa.idPessoa}"/> 

坚持的ContaCorretora之前,请确保您从数据库获取的佩索阿对象。

@RequestMapping(method=RequestMethod.POST) 
public ModelAndView gravar(ContaCorretora contaCorretora) { 

    contaCorretora.setPessoa(pessoaDao.find(contaCorretora.getPessoa().getIdPessoa())); 
    //I escaped null check and not found exceptions, you should apply some logic to take care of that 
    contaCorretoraDao.gravar(contaCorretora); 
    return new ModelAndView("pessoa/listageral"); 
} 

使用实体作为表单模型不是一个好方法。持久层不应该在MVC层上。

+0

对不起,我不明白你的好答案提出异议。我在我的方法POST请求中使用了这些命令,但表单继续发生错误。 –

+0

@MuriloGóesdeAlmeida对不起,我添加了隐藏属性作为纯文本,所以它真的隐藏在我的答案中,我再次添加它请阅读我的编辑 –

+0

现在我理解你的观点。我确切地使用了你的展示方式和它的作品!我只需要将value =“$ {pessoa.idPessoa}更改为value =”$ {model.pessoa.idPessoa} –

0

为了从您的控制器

@RequestMapping(method=RequestMethod.POST) 
public ModelAndView gravar(ContaCorretora contaCorretora) {  
    ModelAndView mav = new ModelAndView("pessoa/listageral"); 
    // retrieve object from DAO 
    Object myObj = Dao.find(id); 
    // Put object into model map 
    mav.addObject("myObj", myObj); 
    // return model and view 
    return mav; 
} 

通过Java对象在JSP中你可以参考使用ExpressionLanguage syntax

${myObj}