Persistindo dados de um relacionamento M:N (hibernate)

Pessoal,

Tenho o seguinte problema: tenho uma lista de menus que estão associadas a um tipo de usuario. Para evitar o problema de M:N, criei uma tabela associativa, mas estou com duvidas na criação das anotações e como persistir esses dados.
Preciso que seja escolhido um tipo de usuário e para cada tipo, selecione os menus que esse tipo de usuario terá acesso, depois disso devo persistir, na tabela associativa, o id do tipo e o id dos menus. Tenho o tipo de usuário e a lista de menus que ele terá acesso, porém não sei como persistir na tabela associativa, da maneira que fiz, só salva o último menu da lista e não todos.

TipoUsuario:

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "tipoUsuario")
    private List<Permissao> permissoes; 

Menu:

 @OneToMany(cascade = CascadeType.ALL, mappedBy = "menu")
  private List<Permissao> permissoes;

Permissao

    @ManyToOne
    @JoinColumn(name = "id_tipo_usuario", referencedColumnName = "id")
    private TipoUsuario tipoUsuario;
    
    @ManyToOne
    @JoinColumn(name = "id_menu", referencedColumnName = "id")    
    private Menu menu;

XHTML:

<p:selectOneMenu id="listaTipoUsuario" 
                                     value="#{permissaoController.permissao.tipoUsuario}"
                                     converter="tipoUsuarioConverter"                                                                                                                                                    
                                     required="true"                                     
                                     requiredMessage="Por favor, selecione o tipo de usu&aacute;rio.">             
                        <f:selectItem itemLabel="Selecione..."/>
                        <f:selectItems value="#{tipoUsuarioController.listaDeTiposDeUsuarioParaCombobox}"/>                                                                                                                     
                        <!--<p:ajax update="permissoesPorTipo"
                                listener="#{permissaoController.carregaPermissoesPorTipoDeUsuario}"/>-->
                    </p:selectOneMenu>                                                                 

                    <h:outputLabel for="permissoesTipoUsuario" value="Permiss&otilde;es:"
                                   styleClass="labelNegrito"/>                                                                                                                    

                    <p:selectManyCheckbox id="menus" layout="pageDirection"
                                          value="#{permissaoController.menusSelecionados}"
                                          converter="menuConverter"
                                          required="true"                                     
                                          requiredMessage="Por favor, selecione pelo menos um menu."> 
                        <f:selectItems value="#{menuController.listaDeSelectItensDeMenu}"/>                        
                    </p:selectManyCheckbox>
                    <p:column/>
 <p:commandButton image="ui-icon-disk" value="Salvar"                                     
                                 actionListener="#{permissaoController.salvar}"/>                      
                <p:commandButton image="ui-icon-arrowthickstop-1-w" value="Voltar"
                                 onclick="javascript:history.back(1)"
                                 immediate="true"/>

MB:

 //Salva ou edita a categoria no BD
    public void salvar() throws IOException {                                            
        
        for (int i = 0; i < this.menusSelecionados.size(); i++) {
            this.permissao.setMenu(menusSelecionados.get(i));
            
            this.permissaoDao.save(this.permissao);            
        }

Como posso salvar a lista de menus de cada tipo de usuario, na tabela permissao? As anotações estão corretas? A lista fica nas classes Menu e Tipo de usuario mesmo ou no classe permissao? O for coloquei mais para teste e para ilustrar o que quero. Preciso que quando o usuario escolher o tipo de usuario adminsitrador, e clicar nos menus 1, 2 e 3. Seja salvo no Bd (tabela permissao) o id do tipo de usuario(no caso 1) e os menus selecionados, ficando assim:
id_tipo id _menu
1 1
1 2
1 3

Pessoal,

Fiz o seguinte:

Menu:

 @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "permissao", schema = "estoque",
    joinColumns = {
        @JoinColumn(name = "id_menu")},
    inverseJoinColumns = {
        @JoinColumn(name = "id_tipo_usuario")})
    private List<TipoUsuario> tipos;

TipoUsuario:

 @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "permissao", schema = "estoque",
    joinColumns = {
        @JoinColumn(name = "id_tipo_usuario")},
    inverseJoinColumns = {
        @JoinColumn(name = "id_menu")})
    private List<Menu> menus;

MB:

        this.tipoUsuario.setMenus(menusSelecionados);
        
        Menu menu = new Menu();
        menu.setTipos(new ArrayList<TipoUsuario>());                           
        menu.getTipos().add(this.tipoUsuario);

       dao.saveOrUpdate(tipoUsuario);

O problema é que, da maneira com fiz agora, ele está salvando um novo tipo de usuário (tudo null) e colocando o novo id desse tipo de usuario salvo junto com os ids dos menus. Ao inves de colocar o id 1, por exemplo, do tipo de usuario que eu escolhi, ele tá salvando na tabela o id do tipo de usuario 2, sendo que não é isso que eu quero. Como posso resolver isso?

Alguém?