[RESOLVIDO] JPA - Relacionamento N:M cria uma única tabela para vários relacionamentos

3 respostas
D

Ola Pessoal

Tenho duas classes entidade EntityRepository e EntityUser, e tenho também vários relacionamentos entre essas duas classes, como podem ver abaixo:

Classe EntityRepository:

@Entity
@Table(name = "gitRepository")
public class EntityRepository implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Temporal(javax.persistence.TemporalType.TIMESTAMP)
    //....
    @ManyToOne
    private EntityUser owner;
    @JoinColumn(name = "COLLABORATEDREPOSITORIES_ID")
    @ManyToMany(mappedBy = "collaboratedRepositories")
    private List<EntityUser> collaborators;
    @JoinColumn(name = "WATCHEDREPOSITORIES_ID")
    @ManyToMany(mappedBy = "watchedRepositories") 
    private List<EntityUser> watchers;
    //....
}

Classe EntityUser:

@Entity
@Table(name = "gitUser")
public class EntityUser implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    //....
    @ManyToMany
    private List<EntityRepository> watchedRepositories;
    @ManyToMany
    private List<EntityRepository> collaboratedRepositories;
    //....
}

Meu problema é que todos esses relacionamentos estão sendo criados em uma única tabela no banco, ficando assim:


obs: caso não consigam visualizar a imagem acima, clique aqui: http://imageshack.us/f/193/notnull.png/

Vejam que os campos dessa tabela ficam como “NotNull”, não consegui fazer com que eles não ficassem assim, dessa forma eu não consigo fazer apenas um dos relacionamentos porque todos os campos dessa tabela precisam ficar preenchidos.

Sendo assim, pergunto: Não existe uma forma com que esses campos não fiquem como “NotNull”, ou uma forma de fazer o JPA criar duas tabelas, uma para relacionamento de Watchers e outra para relacionamento de Collaborators?

Agradeço antecipadamente.
Douglas Junior

3 Respostas

D

Se interessarem, os fontes do projeto estão aqui: https://github.com/douglasjunior/DouglasJuniorTCC

Abraços.
Douglas Junior

L

Coloca o @JoinTable nos m:n para ver se ele cria a outra tabela.
Tenta também tirar o @JoinColumn nos lados que são mappedBy. Acho que esse tipo de config tinha que ficar no lado “forte”

D

lele_vader:
Coloca o @JoinTable nos m:n para ver se ele cria a outra tabela.
Tenta também tirar o @JoinColumn nos lados que são mappedBy. Acho que esse tipo de config tinha que ficar no lado “forte”

Problema resolvido!

Retirei os @JoinColun’s (na verdade não entendo mto bem para que servem) e coloquei o @JoinTable(name=“nome da tabela desejada”) do lado que não é mappedBy.

Ficou assim:

@Entity  
    @Table(name = "gitUser")  
    public class EntityUser implements Serializable {  
      
        private static final long serialVersionUID = 1L;  
        @Id  
        @GeneratedValue(strategy = GenerationType.IDENTITY)  
        private Long id;  
        //....  
        @JoinTable(name = "gitRepository_userWatchers")
        @ManyToMany
        private List<EntityRepository> watchedRepositories;
        @JoinTable(name = "gitRepository_userCollaborators")
        @ManyToMany
        private List<EntityRepository> collaboratedRepositories;
        //....  
    }

Parabéns, e muito obrigado.

Abraços
Douglas Junior

Criado 6 de setembro de 2012
Ultima resposta 6 de set. de 2012
Respostas 3
Participantes 2