Como mapear uma entidade para usar uma FK de outra classe já existente? [RESOLVIDO]
10 respostas
Metallica
Oi pessoal,
To achando difícil até descrever o problema, mas deve ser simples: tenho uma classe Arquivo e outra Extensao. Um Arquivo tem uma Extensão mas a Extensão nada sabe do Arquivo.
Como faço pro Arquivo usar tal extensão que já existe na tabela Extensão? Por exemplo se eu salvo dois arquivos com extensão mp3, ele cria 2 linhas mp3 na tabela de extensão, cada uma com um ID. Quero reusar essa linha com o ID do mp3.
vc quer criar uma relacao 1 pra 1 entre as duas entidades aonde a entidade Arquivo tera um id (fk) corresponde da entidade Extensao…e isso?
lelodois
Seria bom fazer um diagrama para entendermos
quikkoo
a explicação foi pouco confusa mesmo, mas me parece q a intensão é usar um relacionamento de muitos pra um, já que varios arquivos podem possuir uma mesma extenção, sendo assim o mapeamento da classe Arquivo ficaria assim:
(A primeira tabela é o jeito que eu quero, e a segunda tabela é o jeito que está ficando. Percebam como a extensão está repetindo valores.)
Ou seja, eu quero que o arquivo tenha o ID de uma extensão, mas a extensão não pode se repetir e criar uma extensão pra cada arquivo.
quikkoo
como eu disse na postagem acima, é um relacionamento de muitos pra um…
Metallica
Então, eu já tinha tentado fazer @ManyToOne também. E dava o mesmo problema. Várias extensões repetidas na tabela de Extensao, exatamente como a tabela da figura mostra.
Tem certeza que é só mapear muitos para um?
Minhas classes ficaram assim:
@EntitypublicclassExtensaoimplementsSerializable{@Id@GeneratedValueprivateLongid;@Column(name="extensao")privateStringtipo;//getters e setters}
Então, ninguém sabe mesmo? Ainda não consegui resolver isso.
lelodois
Segue…
Extensao.java
@EntitypublicclassExtensaoimplementsSerializable{@Id@GeneratedValueprivateLongid;@Column(name="extensao",unique=true)privateStringtipo;@OneToMany(mappedBy="extensao",fetch=FetchType.LAZY)privateSet<Arquivo>arquivos=newHashSet<Arquivo>();// get and set}
Arquivo
@Entity@TablepublicclassArquivoimplementsSerializable{@Id@GeneratedValueprivateLongid;@ColumnprivateStringnome;@ColumnprivateFloattamanho;@ManyToOne@ForeignKey(name="extensao_fk")privateExtensaoextensao;// get and set}
Execução
@Overridepublicvoidexecute(Sessionsession){List<File>files=Arrays.asList(newFile("c:\\teste").listFiles());Transactiontransacao=session.beginTransaction();for(Filefile:files){// Não faça isto em casa // #bug (se exister no arquivo + de um "."String[]nomeExtensao=file.getName().split("\\.");StringnomeArquivo=nomeExtensao[0].toString();StringnomeDaExtensao=nomeExtensao[1].toString();Extensaoextensao=this.criarExtensao(nomeDaExtensao,session);Arquivoarquivo=newArquivo(extensao,899832.09F,nomeArquivo);extensao.getArquivos().add(arquivo);session.merge(arquivo);}transacao.commit();}privateExtensaocriarExtensao(Stringtipo,Sessionsession){Criteriacrit=session.createCriteria(Extensao.class);Extensaoobj=(Extensao)crit.add(Restrictions.ilike("tipo",tipo,MatchMode.EXACT)).uniqueResult();if(obj==null)obj=(Extensao)session.merge(newExtensao(tipo));returnobj;}}
Existem outras formas de fazer… mas esta é a q eu gosto
Abraços
Metallica
Segue…
Existem outras formas de fazer… mas esta é a q eu gosto
Abraços
Obrigadíssimo!
Funcionou certinho. Apesar de ser uma coisa tão comum em banco de dados, achei tão complicado em Hibernate.
lelodois
Segue…
Existem outras formas de fazer… mas esta é a q eu gosto
Abraços
Obrigadíssimo!
Funcionou certinho. Apesar de ser uma coisa tão comum em banco de dados, achei tão complicado em Hibernate.