Autor |
Mensagem |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 17/01/2008 10:41:33
|
michael-pr
Equipe
Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline
|
Salve javaneses!
duas duvidas:
1- Como faço para filtrar a lista(combo) que vem preenchida de de um relacionamento ManyToOne? Explico: Imagine um cadastro de cidades com a opção Capital, e outro cadastro de pessoa no qual vincula-se uma cidade, mas as opções oferecidas do combo cidade so devem constar as capitais.
2- na aplicação de demostração do neo existe um exemplo de upload de arquivo, mas eu posso vincular somento um arquivo a uma pessoa,
como ficaria se eu quisesse vincular mais de um arquivo. ex. um email com vários anexos.
Grato desde já
|
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 17/01/2008 10:53:26
|
pedro.goncalves
Equipe
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline
|
2 - Você pode montar uma lista de arquivos =p
Tenho exemplos se quiser
|
Pedro Gonçalves
http://pedrogoncalves.com.br
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 17/01/2008 10:55:53
|
pedro.goncalves
Equipe
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline
|
1- É uma questão de ajax + JavaScript, e é bastante específico..
Eu posso te ajudar a montar.. mas começa ele ai que aqui vamos tocando ele..
[]'s
|
Pedro Gonçalves
http://pedrogoncalves.com.br
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 17/01/2008 11:05:41
|
michael-pr
Equipe
Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline
|
Blz Pedro,
em relação a lista, tambem dá pra fazer uma query específica e mandar a lista para o itens da property. o que acha?
agora quanto a lista de arquivos se vc puder me mandar eu agradeço
michael (em) maikosoft.com.br
|
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 17/01/2008 11:31:15
|
pedro.goncalves
Equipe
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline
|
Pode ser também.
Vou pedir o hugo para portar no fórum o exemplo. Guenta ai.
|
Pedro Gonçalves
http://pedrogoncalves.com.br
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 17/01/2008 13:45:40
|
hugo.ferreira
Equipe
![[Avatar]](/forum/images/avatar/7cbbc409ec990f19c78c75bd1e06f215.jpg)
Membro desde: 20/11/2007 14:32:17
Mensagens: 4
Offline
|
Olá, michael-pr!
Bem, acho q tenho uma coisa parecida aki que pode te ajudar...
Para salvar uma lista de arquivos vinculadas a um bean temos que salvar arquivo por arquivo, na "unha".
Temos esses Beans:
Code:
@Entity
public class Email implements Serializable {
private static final long serialVersionUID = 1L;
protected Integer cdemail;
protected String mensagem;
protected Set<Anexo> listaAnexo = new ListSet<Anexo>(Anexo.class);
//Gets and Sets
}
Code:
@Entity
public class Anexo implements Serializable {
private static final long serialVersionUID = 1L;
protected Integer cdanexo;
protected Email email;
protected Arquivo arquivo;
//Gets and Sets
}
Criamos uma função no AnexoService que grava os arquivos da lista um a um:
Code:
public void saveAnexo(Email email) {
Set<Anexo> listaAnexo = email.getListaAnexo();
if (listaAnexo != null && listaAnexo.size() > 0) {
for (Anexo anexo : listaAnexo) {
arquivoDAO.saveFile(anexo, "arquivo");
}
}
}
E por fim, sobrescrevemos as funções updateSaveOrUpdate, saveOrUpdate e delete de "EmailDAO":
Code:
@Override
public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) {
Email email = (Email) save.getEntity();
anexoService.saveFotosAnexo(email);
save.saveOrUpdateManaged("listaAnexo");
}
Code:
@Override
public void saveOrUpdate(final Email email) {
transactionTemplate.execute(new TransactionCallback(){
public Object doInTransaction(TransactionStatus arg1) {
EmailDAO.super.saveOrUpdate(email);
return null;
}});
}
Code:
@Override
public void delete(Email bean) {
List<Anexo> findBy = anexoService.getByEmail(bean);
for (Anexo anexo : findBy) {
anexoService.delete(anexo);
arquivoDAO.delete(anexo.getArquivo());
}
super.delete(bean);
}
Espero que tenha ajudado.
Um abraço!
|
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 17/01/2008 17:52:42
|
michael-pr
Equipe
Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline
|
Valeu Hugo,
voce me deu uma luz então eu fiz assim:
na bean principal eu fiz o relacionamento um-para-muitos normal.
Code:
@OneToMany(cascade={CascadeType.PERSIST, CascadeType.REMOVE}, mappedBy="pendencia")
public List<AnexoPendencia> getArquivos() {
return arquivos;
}
public void setArquivos(List<AnexoPendencia> arquivos) {
this.arquivos = arquivos;
}
no bean filhos ficou assim:
Code:
public class AnexoPendencia implements Serializable {
private static final long serialVersionUID = 1L;
protected Long id;
protected Arquivo arquivo;
protected Pendencia pendencia;
protected String nome;
protected String tipoconteudo;
protected Long tamanho;
protected byte[] conteudo;
protected Timestamp tsmodificacao;
public AnexoPendencia() {
}
public AnexoPendencia(Long id) {
this.id = id;
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO, generator="gen_anexo_pendencia")
public Long getId() {
return id;
}
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="id_pendencia")
@Required
public Pendencia getPendencia() {
return pendencia;
}
@Transient
public Arquivo getArquivo() {
if (arquivo == null && id != null) {
arquivo = new Arquivo();
arquivo.setCdfile(id);
arquivo.setContent(conteudo);
arquivo.setContenttype(tipoconteudo);
arquivo.setName(nome);
arquivo.setSize(tamanho);
arquivo.setTsmodification(tsmodificacao);
}
return arquivo;
}
public void setArquivo(Arquivo arquivo) {
this.arquivo = arquivo;
}
// demais gettes and settes
no PendenciaDAO sobrescrevi os metodos:
Code:
@Override
public void updateEntradaQuery(QueryBuilder<Pendencia> query) {
query.fetchCollection("pendenciasDelegadas");
query.fetchCollection("arquivos");
}
@Override
public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) {
save.saveOrUpdateManaged("pendenciasDelegadas");
Pendencia bean = (Pendencia)save.getEntity();
List<AnexoPendencia> arquivos = bean.getArquivos();
for (AnexoPendencia anexo: arquivos) {
anexo.setNome(anexo.getArquivo().getName());
anexo.setTipoconteudo(anexo.getArquivo().getContenttype());
anexo.setTamanho(anexo.getArquivo().getSize());
anexo.setConteudo(anexo.getArquivo().getContent());
anexo.setTsmodificacao(anexo.getArquivo().getTsmodification());
}
save.saveOrUpdateManaged("arquivos");
}
e na view pendenciaEntrada.jsp
Code:
...
</t:detalhe>
<t:detalhe name="arquivos">
<t:property name="arquivo"/>
</t:detalhe>
</t:janelaEntrada>
</t:entrada>
ok, ele inseri, altera e apaga gravando no banco blz.
so que agora preciso fazer download, e o arquivo do neo view.DownloadFileServlet so faz download de arquivo fisico.
vou ter que fazer um Servlet pra baixar do banco ou alguem tem algum pronto?
|
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 18/01/2008 11:34:45
|
michael-pr
Equipe
Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline
|
Opa,
revisando a implementação acima eu percebi que
se voce alterar os valores da tela principal (pendencia), os anexos eram alterados tambem devido ao save.saveOrUpdateManaged("arquivos");
no PendenciaDAO. Então eu alterei essa parte para:
Code:
@Override
public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) {
save.saveOrUpdateManaged("pendenciasDelegadas");
Pendencia bean = (Pendencia)save.getEntity();
List<AnexoPendencia> arquivos = bean.getArquivos();
for (AnexoPendencia anexo: arquivos) {
if ((anexo.getArquivo() != null) && (anexo.getArquivo().getSize()>0)) {
anexo.setNome(anexo.getArquivo().getName());
anexo.setTipoconteudo(anexo.getArquivo().getContenttype());
anexo.setTamanho(anexo.getArquivo().getSize());
anexo.setConteudo(anexo.getArquivo().getContent());
anexo.setTsmodificacao(anexo.getArquivo().getTsmodification());
anexo.setPendencia(bean);
anexoPendenciaDAO.saveOrUpdate(anexo);
}
}
}
agora ta inserindo e alterando certo.
mas nem tudo são flores....
o remover anexo tambem vou ter que fazer na unha,
e ai que surge o problema.
1- eu poderia criar um controler e colocar um botão remover so pra ir no banco de dados e remover um a um o anexo gravado.
2- eu poderia aproveitar o botão criado no <t:detalhe name="arquivos"> do jsp, mas a maneira de fazer isso é comparnado a lista que ta gravado no banco, com a lista que chega da bean (Pendencia)save.getEntity().getArquivos();
Pedro, Hugo o que acham?
|
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 21/01/2008 09:51:16
|
michael-pr
Equipe
Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline
|
Opa,
pra quem ta acompanhando segue o codigo pra fazer download do anexo que está no banco
Code:
@Controller(path="/secured/anexoPendencia",authorizationModule=CrudAuthorizationModule.class)
public class AnexoPendenciaController extends MultiActionController{
AnexoPendenciaService anexoPendenciaService;
public void setAnexoPendenciaService(AnexoPendenciaService anexoPendenciaService) {
this.anexoPendenciaService = anexoPendenciaService;
}
@DefaultAction
public ModelAndView doDownload(WebRequestContext request,Usuario usuario){
Long id = new Long(request.getParameter("id"));
AnexoPendencia bean = new AnexoPendencia(id);
bean = anexoPendenciaService.load(bean);
Resource resource = new Resource(bean.getTipoconteudo(), bean.getNome(), bean.getConteudo());
resource.setSize(bean.getTamanho().intValue());
return new ResourceModelAndView(resource);
}
}
|
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 21/01/2008 09:56:27
|
michael-pr
Equipe
Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline
|
Opa
agora preciso fazer o link para o download no jsp
como façoa pra montar um link passando o id do registro que eu quero?
eu fiz no jsp:
Code:
<t:detalhe name="arquivos" >
<t:property name="id"/>
<t:property name="arquivo" showRemoverButton="false" transientFile="true" />
<t:acao>
<n:link url="/secured/anexoPendencia?id=${bean.arquivos.id}" >download</n:link>
</t:acao>
</t:detalhe>
mas o link gerado não imprime o id
|
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 21/01/2008 10:11:26
|
michael-pr
Equipe
Membro desde: 14/01/2008 09:33:19
Mensagens: 9
Offline
|
Ok, pesquisando uma outra duvida, obtive a resposta
Code:
<t:detalhe name="arquivos" >
<t:property name="id"/>
<t:property name="arquivo" showRemoverButton="false" transientFile="true" />
<t:acao>
<n:link url="/secured/anexoPendencia?id=${pendencia.arquivos[index].id}" type="BUTTON" >download</n:link>
</t:acao>
</t:detalhe>
|
 |
|
 |
![[Post New]](/forum/templates/default/images/icon_minipost_new.gif) 21/01/2008 20:46:30
|
pedro.goncalves
Equipe
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline
|
Bom trabalho michael =p
|
Pedro Gonçalves
http://pedrogoncalves.com.br
 |
|
 |
|