【问题标题】:Send object in JSP as foreign key using Spring MVC and Hibernate使用 Spring MVC 和 Hibernate 将 JSP 中的对象作为外键发送
【发布时间】:2017-07-01 23:45:58
【问题描述】:

我想创建一个与 OneToMany 关系中的特定人员相关的银行帐户注册。

我有 clas Pessoa(人):

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

我在Controller中使用这个方法来启动注册过程:

@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 表单中传递整个对象。 post方法是:

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

DAO 的所有方法都可以。

【问题讨论】:

    标签: java spring hibernate jsp spring-mvc


    【解决方案1】:

    您只需将 pessoa 的主键发送到表单。 更改表单属性

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

    在持久化 ContaCorretora 之前,请确保您从 db 获取 Pessoa 对象。

    @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 层上。

    【讨论】:

    • 对不起,我不太明白你的回答。我在我的方法 POST 请求中使用了这些命令,但表单继续出错。
    • @MuriloGóesdeAlmeida 抱歉,我将 from hidden 属性添加为纯文本,所以它真的隐藏在我的答案中,我再次添加它请阅读我的编辑
    • 现在我明白你的意思了。我完全使用了您向我展示的方式,它的工作原理!我只需要将 value="${pessoa.idPessoa} 更改为 value="${model.pessoa.idPessoa}
    • @MuriloGóesdeAlmeida 太好了,你能把它标记为答案吗?
    【解决方案2】:

    为了从你的控制器传递 Java 对象

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

    在 JSP 中,您可以使用 ExpressionLanguage syntax 引用对象

      ${myObj}
    

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 1970-01-01
      • 2016-02-24
      • 2014-08-05
      • 2018-01-19
      • 2017-09-15
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多