Para o manyToMany não somos obrigados a ter esse POJO (Matricula_Func) como vc falou, mas se essa tabela no banco tiver mais algum atributo que não seja as duas chaves estrangeiras teremos que fazer um mapeamento exclusivo dela no java.
O hibernate pode ser usado sim mesmo que ele não seja gerado pelo hibernate, mas para bancos muitos complexos (como de sistemas financeiros gigantes de bancos) exige muito esforço e muita experiência mesmo. Mas muita.
Espero ter ajudado
Att Davi
estou construindo uma pequena aplicação, pequena mesmo, mas um tanto complexa, pois trata-se de árvore de dependência, logo há muita FK, muitos ManyToMany e gostaria que o Hibernate fizesse o trabalho de banco e assim, eu aprendo a usar esse cara, aprender a mapear corretamente e não mais passar pelo que eu passei recentemnente. Pelo que eu entendi nesse ManyToMany, o Hibernate então faz todo o trabalho, sem a necessidade de eu criar uma tabela de junção. Ele(hbm) faz isso sozinho. Entendi, se tudo que existir no banco, tem que existir no java, claro exceto se houver excessão.
Vc com uma pequena pesquisa vai achar vários exemplos de mapeamento na internet, recomendo a referência do próprio hibernate.
Abcs
att Davi