Dúvida em como fazer persistência/consulta de entidades

0 respostas
rafael.espiritosanto

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!

Criado 3 de agosto de 2009
Respostas 0
Participantes 1