Pessoal,
em um projeto, tenho que fazer o parser de um arquivo xml (no código que postei, faço este parser na mão porque infelizmente o xml é mal formado) e persistir as entidades no banco usando JPA.
Eis umas das classes de importância no projeto
package br.cos.ufrj.bd3.model;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
@Entity
public class Noticia {
public static long n;
private long id;
private Titulo titulo;
private SubTitulo subTitulo;
private List<Paragrafo> listaParagrafos;
private List<Elemento> listaElementos;
private List<Secao> listaSecoes;
private String caderno;
public Noticia() {
listaParagrafos = new ArrayList<Paragrafo>();
listaElementos = new ArrayList<Elemento>();
listaSecoes = new ArrayList<Secao>();
}
@Id
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@OneToOne(cascade=CascadeType.ALL)
public Titulo getTitulo() {
return titulo;
}
public void setTitulo(Titulo titulo) {
this.titulo = titulo;
}
@OneToOne(cascade=CascadeType.ALL)
public SubTitulo getSubTitulo() {
return subTitulo;
}
public void setSubTitulo(SubTitulo subTitulo) {
this.subTitulo = subTitulo;
}
@OneToMany(cascade=CascadeType.ALL)
public List<Paragrafo> getListaParagrafos() {
return listaParagrafos;
}
public void setListaParagrafos(List<Paragrafo> listaParagrafos) {
this.listaParagrafos = listaParagrafos;
}
@OneToMany(cascade=CascadeType.ALL)
public List<Elemento> getListaElementos() {
return listaElementos;
}
public void setListaElementos(List<Elemento> listaElementos) {
this.listaElementos = listaElementos;
}
@ManyToMany
public List<Secao> getListaSecoes() {
return listaSecoes;
}
public void setListaSecoes(List<Secao> listaSecoes) {
this.listaSecoes = listaSecoes;
}
@Override
public String toString() {
StringBuilder s = new StringBuilder();
if(titulo != null) {
s.append(titulo.getConteudo() + "\n");
}
for (Paragrafo p : listaParagrafos) {
s.append(p.toString() + "\n");
}
return s.toString();
}
public String getCaderno() {
return caderno;
}
public void setCaderno(String caderno) {
this.caderno = caderno;
}
}
O que importa nesta classe (considerando minha dúvida) é o relacionamento entre Notícia e Secao (que é N:M).
A minha dúvida é como tratar este relacionamento no momento de realizar o parser do arquivo xml.
Aqui segue o trecho do parser que me gera a dúvida
String linha = scanner.nextLine();
if (linha.contains("<ext ")) {
dentroExtrato = true;
extrato = new Extrato();
noticia = new Noticia();
noticia.setTitulo(null);
String inicio = linha.substring("<ext id=".length());
String conteudoId = inicio.substring(0, inicio.indexOf("cad")).trim();
int posInicioCad = linha.indexOf("cad=");
int posInicioSec = linha.indexOf("sec=");
String caderno = linha.substring(posInicioCad + 5, posInicioSec - 2);
noticia.setCaderno(caderno);
String stringSecao = linha.substring(posInicioSec + 5, linha.indexOf("sem=") - 2);
StringTokenizer tokenizer = new StringTokenizer(stringSecao, "-");
while (tokenizer.hasMoreElements()) {
String conteudoSecao = tokenizer.nextToken();
//Caso exista uma seção com este nome no banco de dados, devo recuperar a instância e inserí-la na notícia. Caso contrário, devo persistir esta nova seção e inserí-la na notícia
Secao secao = new Secao();
secao.setNome(conteudoSecao);
}
extrato.setIdExtrato(conteudoId);
A seção é um atributo da tag e pode conter mais de um valor (que são separados por “-”).
Em teoria, quando eu atualizo o valor da variável “conteudoSecao”, deveria executar uma consulta ao banco de dados pra ver se a seção já foi cadastrada previamente para então executar o método noticia.setSecao(secao).
A questão é que na classe que realizo o parser não existe referência a qualquer coisa do JPA (e gostaria de manter assim, para manter o acoplamento baixo).
Como posso tratar este problema?
Obrigado pela ajuda!