Relacionamento @ManyToMany retorna null para a lista [RESOLVIDO]

Boa tarde,

Estou com o seguinte problema.

Tenho 5 tabelas: Pessoas, imagensdepessoas, Imagens, enderecosdepessoas e enderecos.

Classe Pessoa

@Entity
@Table(name = "pessoas")
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class AbstractPessoa implements Serializable {

    @Id
    @GeneratedValue(generator = "system-uuid")
    @GenericGenerator(name = "system-uuid", strategy = "uuid")
    @Column(name = "id", unique = true, nullable = false, length = 32)
    private String id;
    @Column(nullable = false)
    private String nome;
    @Temporal(javax.persistence.TemporalType.DATE)
    @Column(nullable = false)
    private Date dataDeNascimento;
    @Column(nullable = true)
    private String observacao;
    
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "imagensdepessoas", joinColumns =
    @JoinColumn(name = "pessoa"), inverseJoinColumns =
    @JoinColumn(name = "imagem"))
    private List<Imagem> imagens;
    
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "enderecosdepessoas", joinColumns =
    @JoinColumn(name = "pessoa"), inverseJoinColumns =
    @JoinColumn(name = "endereco"))
    private List<Endereco> enderecos;

Classe Imagem

@Entity
@Table(name = "imagens")
public class Imagem extends Entidade {

    @Lob
    @Column(nullable = false)
    private byte[] valor;
    @ManyToMany(targetEntity = AbstractPessoa.class, mappedBy = "imagens")
    private List<AbstractPessoa> pessoas;

Classe Endereço

@Entity
@Table(name = "enderecos")
public class Endereco extends Entidade {

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "logradouro", referencedColumnName = "id", nullable = false)
    private Logradouro logradouro;
    @Column(nullable = true)
    private String numero;
    @Column(nullable = true)
    private String complemento;
    @ManyToMany(targetEntity = AbstractPessoa.class, mappedBy = "enderecos")
    private List<AbstractPessoa> pessoas;

Quando executo a seguinte linha de código:

pessoaFisica = pessoaFisicaDao.salvar(pessoaFisica);

pessoaFisica retorna apenas a lista enderecos vazia, neste caso de forma correta, pois neste momento nenhum endereço está cadastrado para esta nova pessoa. Porém, ele retorna null para a lista de imagens (esperava-se que ele retornasse também uma lista vazia para imagens, da mesma forma que ocorre com endereço) o que será que está errado?

Segue abaixo as tabelas

delimiter $$

CREATE TABLE `pessoas` (
  `id` varchar(32) COLLATE latin1_general_ci NOT NULL,
  `nome` varchar(255) COLLATE latin1_general_ci NOT NULL,
  `dataDeNascimento` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci$$

delimiter $$

CREATE TABLE `imagensdepessoas` (
  `pessoa` varchar(32) COLLATE latin1_general_ci NOT NULL,
  `imagem` varchar(32) COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY (`pessoa`,`imagem`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci$$

delimiter $$

CREATE TABLE `imagens` (
  `id` varchar(32) COLLATE latin1_general_ci NOT NULL,
  `valor` longblob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci$$

delimiter $$

CREATE TABLE `enderecosdepessoas` (
  `pessoa` varchar(32) COLLATE latin1_general_ci NOT NULL,
  `endereco` varchar(32) COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY (`pessoa`,`endereco`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci$$

delimiter $$

CREATE TABLE `enderecos` (
  `id` varchar(32) COLLATE latin1_general_ci NOT NULL,
  `logradouro` varchar(32) COLLATE latin1_general_ci NOT NULL,
  `numero` varchar(10) COLLATE latin1_general_ci DEFAULT NULL,
  `complemento` varchar(255) COLLATE latin1_general_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci$$

Agradeço toda a ajuda que vier.

Boa tarde Jrfercar,

bom creio que tem algo de errado, pois como você ainda não colocou nenhum na tabela de endereço ela deveria retorna nula e não vazia, assim como acontece com as imagens.

Vou rever um projeto que eu fiz, não esta comigo no momento, então quando eu chegar em casa eu envio como você poderia fazer para melhorar. Se não me engano eu creie uma nova classe para a tabela auxiliar, mas era para colocar atributos, mas assim que eu chegar em casa, e rever o projeto eu respondo o post.

Valeu, fico no aguardo.

de qualquer forma, obrigado pela atenção.

Beleza Galera, consegui resolver.

Realmente, deveria retornar null mesmo.

O problema foi solucionado inserindo um list contendo a imagem.

            pessoaFisica.setEnderecos(enderecos);
            pessoaFisica.setImagens(imagens); <<<<------------------

            pessoaFisica = pessoaFisicaDao.salvar(pessoaFisica);

            pessoaFisica.getEnderecos().add(endereco);
            if (imagem != null) {
                pessoaFisica.getImagens().add(imagem);
            }

            pessoaFisica = pessoaFisicaDao.atualizar(pessoaFisica);

De qualquer forma valeu pela atenção.

Ae, que bom que deu certo, só não esquece de editar o assunto do forum colocando [RESOLVIDO] …

Só uma pergunta quando você faz o relacionamento ManyToMany não teria que colocar os id na parte do @join ?