Illegal attempt to associate a collection with two open sessions

Olá desenvovledores, estou com problema de duas sessões abertas no hibernate. No entanto não consigo descobrir onde tais sessões estão abertas.

Encontrei alguns tópicos na web com o msmo problema só que a maioria estava sem respostas, as que foram respondidas não foram o suficiente pra mim. O erro é título do problema. Acredito que tenha algo a ver com relacionamento N : N. Segue uns códigos:

Fornecedor - Model

@Entity
@SequenceGenerator(name = "FORNEC_SEQUENCE", sequenceName = "FORNEC_SEQUENCE",
        allocationSize = 1, initialValue = 0)
@Table(name = "fornecedor")
public class Fornecedor implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "FORNEC_SEQUENCE")
    private Long id;

    @Column(name = "razao_social", nullable = false)
    private String razaoSocial;

    @Column(name = "nome_fantasia", nullable = false)
    private String nomeFantasia;

    @Column(name = "end_logradouro", nullable = false)
    private String logradouro;

    @Column(name = "end_numero", nullable = false)
    private String log_numero;

    @Column(name = "bairro", nullable = false)
    private String bairro;

    @Column(name = "cep", nullable = false)
    private String cep;

    @ManyToOne
    @JoinColumn(name = "id_cidade", nullable = false)
    private Cidade cidade;

    @ManyToOne
    @JoinColumn(name = "tipo_pessoa", nullable = false)
    private TipoPessoa tipoPessoa;

    @Column(name = "cpf_cnpj", nullable = false, unique = true)
    private String cpfCnpj;

    @Column(name = "insc_estadual", nullable = false, unique = true)
    private String inscEstadual;

    @Column(name = "insc_municipal")
    private String inscMunicipal;

    @Column(name = "telefone", length = 13)
    private String telefone;

    @Column(name = "celular", length = 14)
    private String celular;

    @Column(name = "email")
    private String email;

    @ManyToMany(mappedBy = "fornecedores")
    private List<Produto> produtos; // <- detalhe pra esse relacionamento **********

    @ManyToOne
    @JoinColumn(name = "usuario")
    private Usuario usuario;

Produto - Model:

@Entity
@SequenceGenerator(name = "PRODUTO_SEQUENCE", sequenceName = "PRODUTO_SEQUENCE",
        allocationSize = 1, initialValue = 0)
@Table(name = "produto")
public class Produto implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRODUTO_SEQUENCE")
    private Long id;

    @Column(name = "codigo", unique = true, nullable = false)
    private Long codigo;

    @Column(name = "nome", nullable = false)
    private String nome;

    @Column(name = "principio_ativo", nullable = false)
    private String principioAtivo;

    @Column(name = "unidade_medida", nullable = false, length = 2)
    private String unidadeMedida;

    @Column(name = "quantidade_existente")
    private Integer quantidadeExistente;

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "id_produto")
    private List<Preco> precoUnitario;

    @Column(name = "preco_medio")
    private BigDecimal precoMedio;

    @Column(name = "local_armazenado", length = 2)
    private String estoqueLocal;

    @Column(name = "prateleira_armazenado", length = 3)
    private String estoquePrateleira;

    @ManyToMany
    @JoinTable(name = "produto_has_fornecedor", joinColumns = {
        @JoinColumn(name = "produto_id")}, inverseJoinColumns = {
        @JoinColumn(name = "fornecedor_id")})
    private List<Fornecedor> fornecedores;

    @ManyToOne
    @JoinColumn(name = "tipo_produto", nullable = false)
    private TipoProduto tpProduto;

FornecedorDAO:

@Override
public boolean remover(Fornecedor obj) {
    try {
        session = HibernateUtil.getSessionFactory().openSession();
        tx = session.beginTransaction();
        session.delete(obj);
        tx.commit();

        return true;
    } catch (Exception e) {
        tx.rollback();
        System.out.println("catch DAO -> " + e.getMessage());
        e.printStackTrace();
        return false;
    } finally {
        session.close();
    }
}

O erro aparece na hora de excluir um fornecedor.

Grato.

e se vc usar getCurrentSession ao inves de openSession ?

para mim o seu delete vai tentar fazer coisas demais ( como deletar coisas em cascata e talvez isso de zica, mas não tenho certeza

E ae @peczenyj, tranquilo ?

Então man, se eu usar o getCurrentSession a camada DAO cai no catch também só que apontando pra null!

Uma coisa que eu fiz que “resolveu” em partes o problema foi setar a List<Produto> de fornecedor pra null antes de apagar, dai removeu o fornecedor, certinho!

Porém, olhando no banco de dados vi que o hibernate criou outra tabela denominada “produto_fornecedor” estou com receio de que ele não vai usar ou vai conflitar com a tabela que eu criei com @JoinTable na classe Produto (produto_has_fornecedor).

alguma sugestão nesse ponto ?