Mapeando coleções

Boa noite,

Gostaria de uma ajuda, pois bateu uma enorme dúvida!

Estou com dúvida de como mapear o seguinte relacionamento Funcionario x PermissaoFuncionario

public class Funcionario implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO, generator="id_creator")
    @Column(name="id")
    private Long id;

    @OneToMany(mappedBy="funcionario", cascade={CascadeType.ALL}, fetch=FetchType.LAZY)
    private Set<PermissaoFuncionario> permissoes;

}
public class PermissaoFuncionario implements java.io.Serializable, Comparable<PermissaoFuncionario> {

    @Id
    @OneToOne
    @JoinColumn(name = "id_permissao")
    private Permissao permissao;

    @Id
    @OneToOne
    @JoinColumn(name = "id_funcionario")
    private Funcionario funcionario;

}

Seria possível eu adotar a mesma solução para Venda x ItemVenda??

Desde já agradeço!

Você precisa mesmo desse relacionamento bidirecional?
O mapeamento está errado. Se é bidirecional e de um lado você tem one to many, do outro também precisa ter (embora eu discorde da abordagem que você seguiu, cada funcionario tem várias permissões e cada permissão está associada a um único funcionário?)
Reveja a estrutura e pense nisso.

Boa tarde drsmachado,

Realmente estou perdido, batendo cabeça em relação a esses mapeamentos!

Minha idéias é apenas associar as permissões de um dado funcionário.

drsmachado,

Poderia me ajudar novamente, o relacionamento bidirecional não é necessário. Hoje está assim:
Funcionario.java

@Entity
@Table(schema = "public", name = "funcionario")
@SequenceGenerator(name = "id_creator", sequenceName = "funcionario_id")
public class Funcionario implements java.io.Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "id_creator")
    @Column(name = "id")
    private Long id;

    @Column(name = "nome", length = 100)
    private String nome;

    @OneToMany(cascade = {CascadeType.ALL})
    @JoinColumn(name = "id_funcionario")
    private Set<PermissaoFuncionario> permissoes;
}

PermissaoFuncionario.java

@Entity
@Table(schema = "public", name = "permissao_funcionario")
public class PermissaoFuncionario implements java.io.Serializable, Comparable<PermissaoFuncionario> {

    @Id
    @OneToOne
    @JoinColumn(name = "id_permissao")
    private Permissao permissao;

    @Id
    @ManyToOne
    @JoinColumn(name = "id_funcionario")
    private Funcionario funcionario;
}

A tabela no banco:

CREATE TABLE permissao_funcionario(
   id_funcionario int8 NOT NULL,
   id_permissao int8 NOT NULL,
   CONSTRAINT pk_permissao_funcionario PRIMARY KEY (id_funcionario, id_permissao)
);

Desde já agradeço.