Problemas de persistencia

Boa noite pessoal, estou encontrando dificuldades para setar dados no banco, para comecar estamos desenvolvendo um sistema web de demandas no local onde trabalho, j apegamos o bonde andando entao, o sistema esta apresentando alguns problemas, uns ja resolvemmos outros nao e este é que esta me deijo louco: No momento de inserir uma nova demanda, ha a possibilidade da mesma ser enviada p uma pessoa, para varias e para um setor, no caso de enviar para uma pessoa e para setor tudo certo, mas quando monto uma lista por exemplo de tres pessoa maria joao e marcos a demanda so vai para marcos, ja revisei o codigo fiz uma tentativas com arraylist mais nada… Segue abaixo os trechos de codigo se alguem encontrar onde estou errando me ajude :cry:

este é a pagina onde monto a lista de pessoal p onde irar a demanda

		<p:tab id="tab2" title="Setor Destino">
				<p:fieldset>
					<h:panelGrid columns="2" style="margin-bottom: 15px;">
						<h:graphicImage library="images" name="icon_info.gif" />
						<h:outputText value="Para escolher o(s) setor(es) "
							styleClass="label-info" />
					</h:panelGrid>
					<h:panelGrid id="gridAddSetores" columns="3" cellpadding="2"
						cellspacing="5" style="margin-top:5px;">
						<h:column>
							<h:outputLabel for="setores" value="Enviar para qual setor?"
								styleClass="label" style="margin-right: 5px;" />
							<p:commandLink id="setores" value="clique aqui!"
								oncomplete="setoresDialog.show()" immediate="true"
								update="gridAddSetores" />
						</h:column>
						<p:message id="msgSetores" for="setores" />
					</h:panelGrid>

					<h:panelGrid columns="1" id="gridSetOuFunSelecionado"
						cellpadding="2" cellspacing="5" style="margin-top:5px;">
						<p:dataTable var="setor" emptyMessage="Nenhum setor adicionado!"
							value="#{demandaController.nomeSetorOuFuncionario}">
							<p:column headerText="Setor">
								<h:outputText value="#{setor.setor}" />
							</p:column>
							<p:column headerText="Funcionario">
								<h:outputText value="#{setor.funcionario}" />
							</p:column>
							<f:facet name="footer">
								<h:panelGrid id="gridAguardarResposta" columns="2"
									cellpadding="2" cellspacing="5">
									<h:selectBooleanCheckbox id="checkbox" value="true"
										title="Clique aqui para marcar ou desmarcar!" readonly="true"
										rendered="#{demandaController.setorOuFuncionarioSize >= 2? true:false}" />
									<h:outputLabel for="checkbox"
										value="Aguardar resposta de todos os Setores?"
										styleClass="label"
										rendered="#{demandaController.setorOuFuncionarioSize >= 2? true:false}" />
								</h:panelGrid>
							</f:facet>
						</p:dataTable>
					</h:panelGrid>
				</p:fieldset>
				<p:growl id="growFaltaSetor" globalOnly="true" />
			</p:tab>

aqui vai o metodo de montagem da lista

	public void setorOuFuncionario(ActionEvent event) {
		if (this.getSetorOuFuncionario() == null || this.getSetorOuFuncionario().isEmpty()) {
			setSetorOuFuncionario(new ArrayList<Object>());
		}
		if (!this.funcionarioSelecionado1.equals("")) {
			Funcionario f = (Funcionario) this.funcionariosPorSetor.get(this.funcionarioSelecionado1);
			getSetorOuFuncionario().add(f);
			SetorOuFuncionario sf = new SetorOuFuncionario();
			sf.setSetor(f.getSetor().getSigla());
			sf.setFuncionario(f.getPessoa1().getNome());
			sf.setInstanceOfSetor(false);
			sf.setObject(f);
			this.nomeSetorOuFuncionario.add(sf);
			
			
		} else {
			if (!this.setorSelecionado1.equals("")) {
				Setor s = this.setorDao.buscarSetorPeloNome(this.setorSelecionado1);
				getSetorOuFuncionario().add(s);
				SetorOuFuncionario sf = new SetorOuFuncionario();
				sf.setSetor(s.getSigla());
				sf.setFuncionario("Todos");
				sf.setInstanceOfSetor(true);
				sf.setObject(s);
				this.nomeSetorOuFuncionario.add(sf);
			} else {
				FacesUtils.messageError("Selecione um setor!");
			}
		}
		this.funcionarioSelecionado1 = "";
		this.setorSelecionado1 = "";
		System.out.println("LISTA DE servidores: " + nomeSetorOuFuncionario);
	}

e agora o metodo de salvar demanda onde pecorre-se a lista de pessoas p poder mandar p que foi escolhido mas esta enviando para a ultima pessoa escolhida

	public void novaDemanda() throws Exception {
		RequestContext context = RequestContext.getCurrentInstance();
		Calendar dtLimite = Calendar.getInstance();
		dtLimite.setTime(this.dataValidade);
		Collection<DetalheDemanda> dd = new ArrayList<DetalheDemanda>();
		Collection<Arquivo> listaFinalDeArquivos = new ArrayList<Arquivo>();
		boolean demandaSalva = false;
		try {
			AuxPrioridade ap = (AuxPrioridade) this.prioridadeSelecionada.get(this.prioridade.getDescricao());
			AuxCategoria ac = (AuxCategoria) this.categoriaSelecionada.get(this.categoria.getDescricao());
			AuxStatus s = this.statusDao.buscarStatusPorDescricao(DemandaStatus.EM_ANDAMENTO.getNome());
			this.demanda.setPrioridade(ap);
			this.demanda.setCategoria(ac);
			this.demanda.setDataAbertura(DateUtils.returnToday());
			this.demanda.setStatus(s);
			for (Object o : getSetorOuFuncionario()) {
				
				this.detalheDemanda.setDataValidade(dtLimite);
				this.detalheDemanda.setFuncionarioOrigem(usuarioEmSessao().getFuncionario());
				this.detalheDemanda.setSetorOrigem(usuarioEmSessao().getFuncionario().getSetor());
[color=red]
				if (o instanceof Funcionario) {
					Funcionario ff = (Funcionario) o;
					this.detalheDemanda.setSetorDestino(ff.getSetor());
					this.detalheDemanda.setFuncionarioDestino(ff);
					
					
				} [/color]else if (o instanceof Setor) {
					Setor ss = (Setor) o;
					this.detalheDemanda.setSetorDestino(ss);
					System.out.println("setores: " + ss);
				}
				
				this.detalheDemanda.setDemanda(this.demanda);
				dd.add(this.detalheDemanda);
				
			this.demandaDao.salvar(this.demanda);
			
			demandaSalva = true;
		} catch (Exception e) {
			demandaSalva = false;
			FacesUtils.messageInfo("Erro ao criar demanda!");
			throw new Exception(e.getMessage(), e);
		}
		context.addCallbackParam("demandaSalva", demandaSalva);
	}

ta ae galera se alguem perceber o erro me ajude…

O seu problema está na hora de enviar notificação ou de salvar os dados?

Não entendi.

[quote=jakefrog]O seu problema está na hora de enviar notificação ou de salvar os dados?

Não entendi.[/quote]

Esta na hora de salvar os dados, quando a demanda é salva no banco de dados so fica gravado o id da ultima pessoa que adicionei na lista de funcionarios.

[quote=jakefrog]O seu problema está na hora de enviar notificação ou de salvar os dados?

Não entendi.[/quote]

Bom jakefrog para exemplificar melhor, quando preencho todo o formulario de nova demanda todos os campos, anexo arquivos tudo blz e chamo o metodo salvar, a demanda é salva porem se a lista de funcionarios que eu montei durante o cadastro conter mais de um funcionario, no banco so vai constar o id do ultimo funcionario adiconado na lista…

Como está sua classe funcionário?

Teria como você postar apenas o código em que você adiciona o funciona na lista em que deve ser salva?

Vi muito código ali em cima e fiquei perdido! X_x

[quote=jakefrog]Como está sua classe funcionário?

Teria como você postar apenas o código em que você adiciona o funciona na lista em que deve ser salva?

Vi muito código ali em cima e fiquei perdido! X_x[/quote]

jakefrog vou postar a classe funcionario

public class Funcionario implements Serializable, Comparable<Funcionario> {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "pessoa", nullable = false)
    private Integer pessoa;
    ...
    @OneToMany(mappedBy = "funcionarioDestino")
    private Collection<DetalheDemanda> detalheDemandaDestinoCollection;
    @OneToMany(mappedBy = "funcionarioOrigem")
    private Collection<DetalheDemanda> detalheDemandaOrigemCollection;

classe detalhe_demanda

public class DetalheDemanda implements Serializable, Comparable<DetalheDemanda> {
	private static final long serialVersionUID = 1L;
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id", nullable = false)
	private Integer id;
	...
	@JoinColumn(name = "demanda", referencedColumnName = "id")
	@ManyToOne(cascade = CascadeType.MERGE, fetch = FetchType.EAGER)
	private Demanda demanda;
	...
        @JoinColumn(name = "funcionario_origem", referencedColumnName = "pessoa")
	@ManyToOne
	private Funcionario funcionarioOrigem;
	@JoinColumn(name = "funcionario_destino", referencedColumnName = "pessoa")
	@ManyToOne
	private Funcionario funcionarioDestino;
	
//	@JoinColumn(name = "funcionario_destino", referencedColumnName = "pessoa")
//	@OneToMany(cascade = CascadeType.ALL, mappedBy = "demanda")
//	private Collection<Funcionario> funcionarioCollection;
//	@JoinColumn(name = "funcionario_destino", referencedColumnName = "pessoa")
//    @OneToMany(mappedBy = "public")
//	private Collection<Funcionario> funcionarioCollection;

as partes comentadas foi o que eu tentei modificar mas nada aconteceu…
metodo de add funcionarios a lista e depois onde é salvo

[code]
public void setorOuFuncionario(ActionEvent event) {
if (this.getSetorOuFuncionario() == null || this.getSetorOuFuncionario().isEmpty()) {
setSetorOuFuncionario(new ArrayList());
}
if (!this.funcionarioSelecionado1.equals("")) {
Funcionario f = (Funcionario) this.funcionariosPorSetor.get(this.funcionarioSelecionado1);
getSetorOuFuncionario().add(f);
SetorOuFuncionario sf = new SetorOuFuncionario();
sf.setSetor(f.getSetor().getSigla());
sf.setFuncionario(f.getPessoa1().getNome());
sf.setInstanceOfSetor(false);
sf.setObject(f);
this.nomeSetorOuFuncionario.add(sf);

	} else {
		if (!this.setorSelecionado1.equals("")) {
			Setor s = this.setorDao.buscarSetorPeloNome(this.setorSelecionado1);
			getSetorOuFuncionario().add(s);
			SetorOuFuncionario sf = new SetorOuFuncionario();
			sf.setSetor(s.getSigla());
			sf.setFuncionario("Todos");
			sf.setInstanceOfSetor(true);
			sf.setObject(s);
			this.nomeSetorOuFuncionario.add(sf);
		} else {
			FacesUtils.messageError("Selecione um setor!");
		}
	}
	this.funcionarioSelecionado1 = "";
	this.setorSelecionado1 = "";
	System.out.println("LISTA DE servidores: " + nomeSetorOuFuncionario);
}[/code]

[code]
for (Object o : getSetorOuFuncionario()) {
System.out.println(“chegou aqui”);
this.detalheDemanda.setDataValidade(dtLimite);
this.detalheDemanda.setFuncionarioOrigem(usuarioEmSessao().getFuncionario());
this.detalheDemanda.setSetorOrigem(usuarioEmSessao().getFuncionario().getSetor());

			if (o instanceof Funcionario) {
				Funcionario ff = (Funcionario) o;
				this.detalheDemanda.setSetorDestino(ff.getSetor());
				this.detalheDemanda.getFuncionarioCollection().add(ff);
                                    //this.detalheDemanda.setFuncionarioDestino(ff);
				//this.detalheDemanda.setFuncionarioCollection(new ArrayList<Funcionario>());
				
				
				System.out.println("funcionarios: " + ff);
				
			} else if (o instanceof Setor) {
				Setor ss = (Setor) o;
				this.detalheDemanda.setSetorDestino(ss);
				System.out.println("setores: " + ss);
			}
			
			this.detalheDemanda.setDemanda(this.demanda);
			dd.add(this.detalheDemanda);
			System.out.println("LISTA DE DETALHE DEMANDA: " + dd);
			
			
			
		}[/code]

Será que o problema não é que toda hora vc dá um new na lista?
this.detalheDemanda.setFuncionarioCollection(new ArrayList());

[quote=jakefrog]Será que o problema não é que toda hora vc dá um new na lista?
this.detalheDemanda.setFuncionarioCollection(new ArrayList());[/quote]

olha ae jakefrog como estava o metodo antes de eu mexer nele :

public void novaDemanda() throws Exception {
		RequestContext context = RequestContext.getCurrentInstance();
		Calendar dtLimite = Calendar.getInstance();
		dtLimite.setTime(this.dataValidade);
		Collection<DetalheDemanda> dd = new ArrayList<DetalheDemanda>();
		Collection<Arquivo> listaFinalDeArquivos = new ArrayList<Arquivo>();
		
		boolean demandaSalva = false;
		try {
			AuxPrioridade ap = (AuxPrioridade) this.prioridadeSelecionada.get(this.prioridade.getDescricao());
			AuxCategoria ac = (AuxCategoria) this.categoriaSelecionada.get(this.categoria.getDescricao());
			AuxStatus s = this.statusDao.buscarStatusPorDescricao(DemandaStatus.EM_ANDAMENTO.getNome());
			this.demanda.setPrioridade(ap);
			this.demanda.setCategoria(ac);
			this.demanda.setDataAbertura(DateUtils.returnToday());
			this.demanda.setStatus(s);
			for (Object o : getSetorOuFuncionario()) {
				this.detalheDemanda.setDataValidade(dtLimite);
				this.detalheDemanda.setFuncionarioOrigem(usuarioEmSessao().getFuncionario());
				this.detalheDemanda.setSetorOrigem(usuarioEmSessao().getFuncionario().getSetor());
				if (o instanceof Funcionario) {
					Funcionario ff = (Funcionario) o;
					this.detalheDemanda.setSetorDestino(ff.getSetor());
					this.detalheDemanda.setFuncionarioDestino(ff);
				} else if (o instanceof Setor) {
					Setor ss = (Setor) o;
					this.detalheDemanda.setSetorDestino(ss);
					System.out.println("setores: " + ss);
				}
				this.detalheDemanda.setDemanda(this.demanda);
				dd.add(this.detalheDemanda);
				if (this.arquivoSetadoParaUpload) {
					for (Arquivo a : this.arquivosParaUpload) {
						nomeArquivoAnexado = alteraCaracter(a.getNome());
						tipoArquivoAnexado = a.getTipo();
						caminhoArquivoAnexado = alteraCaracter(a.getCaminho());
						a.setNome(nomeArquivoAnexado);
						a.setTipo(tipoArquivoAnexado);
						a.setCaminho(caminhoArquivoAnexado);
						a.setDemanda(this.detalheDemanda);
						listaFinalDeArquivos.add(a);
					}
					this.detalheDemanda.setArquivoCollection(new ArrayList<Arquivo>());
					this.detalheDemanda.getArquivoCollection().addAll(listaFinalDeArquivos);
				}
			}
			this.demanda.setDetalheDemandaCollection(new ArrayList<DetalheDemanda>());
			this.demanda.getDetalheDemandaCollection().addAll(dd);
			this.demandaDao.salvar(this.demanda);
			init();
			demandaSalva = true;
		} catch (Exception e) {
			demandaSalva = false;
			FacesUtils.messageInfo("Erro ao criar demanda!");
			throw new Exception(e.getMessage(), e);
		}
		context.addCallbackParam("demandaSalva", demandaSalva);
	}

bom dia amigos eu ja encontrei uma solução para a questao acima, porem ainda esta com uns probleminhas para resolver, a questão de salvar detalhe da demanda p mais de um usuario de certo, so que ao percorrer a lista de arquivos a parti da segunda interação nao salva mas o id de detalhedemanda.
Irei postar o metodo com as correcoes que fiz e a tabela de aquivos:

public void novaDemanda() throws Exception {
		RequestContext context = RequestContext.getCurrentInstance();
		Calendar dtLimite = Calendar.getInstance();
		dtLimite.setTime(this.dataValidade);
		Collection<DetalheDemanda> dd = new ArrayList<DetalheDemanda>();
		Collection<Arquivo> listaFinalDeArquivos = new ArrayList<Arquivo>();
		
		boolean demandaSalva = false;
		try {
			for (Object o : getSetorOuFuncionario()) {
				System.out.println("detalhe demanda id no inico: " + this.detalheDemanda.getId());
				if(this.demanda.getId() == null){
				AuxPrioridade ap = (AuxPrioridade) this.prioridadeSelecionada.get(this.prioridade.getDescricao());
				AuxCategoria ac = (AuxCategoria) this.categoriaSelecionada.get(this.categoria.getDescricao());
				AuxStatus s = this.statusDao.buscarStatusPorDescricao(DemandaStatus.EM_ANDAMENTO.getNome());
				this.demanda.setPrioridade(ap);
				this.demanda.setCategoria(ac);
				this.demanda.setDataAbertura(DateUtils.returnToday());
				this.demanda.setStatus(s);
				}
				
				this.detalheDemanda.setDataValidade(dtLimite);
				this.detalheDemanda.setFuncionarioOrigem(usuarioEmSessao().getFuncionario());
				this.detalheDemanda.setSetorOrigem(usuarioEmSessao().getFuncionario().getSetor());
				
		
				
				if (o instanceof Funcionario) {
					Funcionario ff = (Funcionario) o;
					this.detalheDemanda.setSetorDestino(ff.getSetor());
					this.detalheDemanda.setFuncionarioDestino(ff);
				} else if (o instanceof Setor) {
					Setor ss = (Setor) o;
					this.detalheDemanda.setSetorDestino(ss);
					System.out.println("setores: " + ss);
				}
				
				this.detalheDemanda.setDemanda(this.demanda);
				dd.add(this.detalheDemanda);
			
				if (this.arquivoSetadoParaUpload) {
					for (Arquivo a : this.arquivosParaUpload) {
						nomeArquivoAnexado = alteraCaracter(a.getNome());
						tipoArquivoAnexado = a.getTipo();
						caminhoArquivoAnexado = alteraCaracter(a.getCaminho());
						a.setNome(nomeArquivoAnexado);
						a.setTipo(tipoArquivoAnexado);
						a.setCaminho(caminhoArquivoAnexado);
						a.setDemanda(this.detalheDemanda);
						listaFinalDeArquivos.add(a);
					}
					this.detalheDemanda.setArquivoCollection(new ArrayList<Arquivo>());
					this.detalheDemanda.getArquivoCollection().addAll(listaFinalDeArquivos);
									}

				this.demanda.setDetalheDemandaCollection(new ArrayList<DetalheDemanda>());
				this.demanda.getDetalheDemandaCollection().addAll(dd);
								
				if (this.demanda.getId() == null){
				
					this.demandaDao.salvar(this.demanda);
				
				} else if (this.demanda.getId() != null){
					
					this.demandaDao.atualizar(this.demanda);
					
					
				}
				this.detalheDemanda = new DetalheDemanda();
				
				
			}
			
			init();
			demandaSalva = true;
		} catch (Exception e) {
			demandaSalva = false;
			FacesUtils.messageInfo("Erro ao criar demanda!");
			throw new Exception(e.getMessage(), e);
		}
		context.addCallbackParam("demandaSalva", demandaSalva);
	}

tabela no banco tb_arquivo:

CREATE TABLE demanda.tb_arquivo
(
id serial NOT NULL,
nome character varying(128) NOT NULL,
tipo character varying(8),
arquivo oid,
demanda integer NOT NULL,
caminho character varying(200),
CONSTRAINT tb_arquivo_pkey PRIMARY KEY (id),
CONSTRAINT fk_demanda FOREIGN KEY (demanda)
REFERENCES demanda.tb_detalhe_demanda (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)