Dúvida Objetos Aninhados STRUTS2

Gostaria de saber se existe alguma forma de o STRUTS popular um objeto através dos dados que envio pelo form.
Sei que isso é possível porque faço isso com um objeto, porém quando o objeto possui relacionamentos não sei qual seria
a sintaxe das tags do STRUTS nem da Action.

Exemplo que funciona normalmente:

grava-funcao.jsp

                <form action="adicionaFuncao" method="post" class="niceform">
                    <fieldset><legend>Dados da função</legend>
                        <wk:campoTexto id="[b]funcao.funcao[/b]" 
                                       label="Nome da Função:"
                                       type="text" size="50" limit="50"/>
                        <s:fielderror fieldName="funcao.funcao"/>
                    </fieldset>
                    <fieldset>
                        <wk:botao id="enviar" value="Enviar"
                                  onClick="submit()"/>
                    </fieldset>
                </form>

adicionaFuncaoAction.java

public class AdicionaFuncaoAction extends ActionSupport{

    private Funcao funcao;
    
    @Override
    @Action(value = "adicionaFuncao", 
        results = {
    @Result(name="success", type="redirect", location = "grava-funcao"),
    @Result(name="input", location="grava-funcao.jsp") 
    },
        interceptorRefs={
    @InterceptorRef("seguranca")
    })
    public String execute() throws Exception {
        
        // Variáveis que armazenarão os valores do formulário
        Connection conn = GerenteConexao.criaConexao();
        
        // Chama o método DAO que faz a inserção no banco de dados
        new FuncaoDAO(conn).grava(getFuncao());
        
        conn.close();

        
        return SUCCESS;
    }

    public Funcao getFuncao() {
        return funcao;
    }

    public void setFuncao(Funcao funcao) {
        this.funcao = funcao;
    }

    
}

Exemplo que não sei como fazer funcionar:

Usuario.java (Modelo)


public class Usuario {
    
    private int id;
    private String cpf, nomeCompleto, usuario, senha;
    private Funcao funcao; // <---- Campo que quero guardar a ID para inserir no banco
    private List<Proposta> propostas;
    
// getters and setters

grava-usuario.jsp


                       <table class="nada">
                            
                            <s:textfield label="CPF" name="usuario.cpf" 
                                         id="usuario.cpf"/>
                            <s:fielderror fieldName="usuario.cpf"/>

                            <s:textfield label="Nome Completo" 
                                         name="usuario.nomeCompleto" 
                                         id="usuario.nomeCompleto"/>
                            <s:fielderror fieldName="usuario.nomeCompleto"/>

                            <s:textfield label="Usuário" name="usuario.usuario" 
                                         id="usuario.usuario"/>
                            <s:fielderror fieldName="usuario.usuario"/>

                            <s:password label="Senha" name="usuario.senha" 
                                         id="usuario.senha"/>
                            <s:fielderror fieldName="usuario.senha"/>

                            <s:select label="Função" name="[b]usuario.funcao.id[/b]"     // <---- Não sei como deve nomear este campo para que o STRUTS detecte automaticamente
                                        headerValue="Selecione a função" 
                                        headerKey="1" list="funcoes.{funcao}"
                                        value="funcoes.{id}"/>
                             
                        </table>    

AdicionaUsuarioAction.java

public class AdicionaUsuarioAction extends ActionSupport{

    private Usuario usuario;
    
    @Override
    @Action(value = "adicionaUsuario", results = {
    @Result(type = "redirectAction", name = "success", 
            params = {"actionName", "listaFuncao"}),
    @Result(name="input", location="grava-funcao.jsp")
    })
    public String execute() throws Exception {
        
        // Variáveis que armazenarão os valores do formulário
        Connection conn = GerenteConexao.criaConexao();
        
        // Chama o método DAO que faz a inserção no banco de dados
        new UsuarioDAO(conn).grava(usuario);   // <------- Não grava porque o ID do objeto do tipo Funcao não existe
        
        conn.close();

        
        return SUCCESS;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    
}