[Logo] Neo Framework Forum
  [Search] Busca   [Recent Topics] Tópicos Recentes   [Members]  Lista de Usuários   [Groups] De volta para a página principal 
[Register] Registrar / 
[Login] Entrar 
CRUD Master-Detalhe  XML
Índice dos Fóruns -> Dúvidas Ir para a página: Anterior  1, 2, 3, 4 Próximo 
Autor Mensagem
rogel.garcia
Xiita

Membro desde: 17/04/2007 16:35:03
Mensagens: 275
Offline

O NEO permite, o problema acontece é só com o hibernate mesmo...

Não tem interferencia do neo nesse caso...

Nós já enfrentamos vários problemas com o hibernate.. por isso recomendamos o padrao.. para evitar tais problemas..
O hibernate tem muitas falhas...

valdecijunior
Equipe
[Avatar]
Membro desde: 23/06/2007 11:56:42
Mensagens: 24
Localização: Vitoria da Conquista - Ba
Offline

Boa tarde galera...

estou tendo problemas para implementar um crud master-detalhe em três níveis. Tenho a seguinte estrutura:

ENTIDADE
SECRETARIAS
DEPARTAMENTOS

e gostaria de implementar essa estrutura usando master-detalhe. A parte de Secretaria e Departamento já está pronta. Como era só dois níveis não houve problemas.... usei tag t:detalhe e tudo ok. Veja:

POJO:
Code:
@Entity
 @Table(name="SECRETARIA")
 @PrimaryKeyJoinColumn(name="CD_SECRETARIA")
 public class Secretaria extends Unidade {
 
 	private static final long serialVersionUID = 1L;
 
 	private Entidade entidade;
 	private List<Departamento> departamentos;
       
        // get's and set's
 

DAO
Code:
public class SecretariaDAO extends GenericDAO <Secretaria>{
 
 	@Override
 	public void updateEntradaQuery(QueryBuilder<Secretaria> query) {
 		query.fetchCollection("departamentos");
 	}
 
 	@Override
 	public void updateSaveOrUpdate(SaveOrUpdateStrategy save) {
 		save.saveOrUpdateManagedNormal("departamentos");
 	}
 
 }
 

JSP
Code:
<%@ taglib prefix="n" uri="neo"%>
 <%@ taglib prefix="t" uri="template"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
 
 <t:entrada>
 	<t:janelaEntrada>
 		<t:tabelaEntrada>
 			<t:property name="codigo"/>
                         ...
 			<t:property name="endereco"/>
 		</t:tabelaEntrada>
 		<t:detalhe name="departamentos">
 			<t:property name="mascara" label="Código"/>
 			<t:property name="nome"/>
 		</t:detalhe>
 	</t:janelaEntrada>
 </t:entrada>


No caso teria que fazer isso partindo de Entidade:
Code:
@Entity
 @Table(name="ENTIDADE")
 @PrimaryKeyJoinColumn(name="CD_ENTIDADE")
 public class Entidade extends Unidade {
 
 	private static final long serialVersionUID = 1L;
 
 	public enum Tipo {PREFEITURA, CAMARA, AUTARQUIA, FUNDACAO}
 
 	private String CNPJ;
 	private Tipo tipo;
 	private List<Secretaria> secretarias;
         ....
         // get's and set's  
 


Veja que em entidade não tem nada a respeito de departamento, essa é uma informação de Secretaria...

como ficaria a implementação do DAO e do JSP?

cheguei a tentar implementar sem usar a t:detalhe conforme http://www.neoframework.org/forum/posts/list/142.page mas ficaria ruim pois, se entendi direito, o usuário teria a opção de cadastrar apenas uma secretaria por vez...

estou aberto também a soluções alternativas para o problema... na verdade preciso mostrar isso funcionando amanhã para um cliente... logo qualquer ajuda é bem vinda rsrs

um abraço vlw

Valdeci Junior
MasterSoft Sistemas Ltda.
[Email] [Yahoo!] [MSN]
pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

Valdeci, infelizmente o Neo ainda não suporta detalhe dentro de detalhe, o segundo você terá que tratar na mão.

Mais podemos pensar em implementar isso. A classe responsável é a Saveorupdate Strategy..

Té!

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
vinicius.janones
Template
[Avatar]

Membro desde: 25/06/2007 12:55:10
Mensagens: 105
Localização: Uberlândia - MG
Offline

rogel.garcia wrote:
Fala valdeci... sempre tentamos responder assim que lemos os posts.. às vezes nem sempre é possível pos estamos trabalhando ou fazendo alguma atividade.. mas a idéia é responder sempre e o mais rápido possível..

sobre sua dúvida.. o neo tem um suporte a master/detalhe...
mas apenas para o jsp de entrada de dados.. para a listagem nao tem nenhum componente faclitador..
para a entrada de dados.. vc faria o seguinte

Code:
 <t:entrada>
     <t:janelaEntrada>
          <t:tabelaEntrada>
                <t:property name="..."/>
          </t:tabelaEntrada>
 
          <t:detalhe property="nome da propriedade detalhe">
               <t:property name="..."/>
          </t:detalhe>
     </t:janelaEntrada>
 </t:entrada>
 


Se vc tem um bean assim:

Code:
 class Principal {
       String nome;
       List<Detalhe> listaDetalhe; //relacionamento one to many
 }
 
 class Detalhe {
       Integer valor;
       Principal principal; //relacionamento many to one
 }
 

(lembre-se dos getters e setters e das annotations para configurar o hbernate)

Seu jsp ficaria assim:
Code:
 <t:entrada>
     <t:janelaEntrada>
          <t:tabelaEntrada>
                <t:property name="nome"/>
          </t:tabelaEntrada>
 
          <t:detalhe property="listaDetalhe">
               <t:property name="valor"/>
          </t:detalhe>
     </t:janelaEntrada>
 </t:entrada>
 


no seu dao<Principal> vc teria que extender o método updateSaveOrUpdate assim:

Code:
 public void updateSaveOrUpdate(SaveOrUpdateStrategy save) {
     save.saveOrUpdateManaged("listaDetalhe");
 }
 


e também o updateEntradaQuery

Code:
 public void updateEntradaQuery(QueryBuilder<Principal> query) {
     query.fetchCollection("listaDetalhe");
 }
 


pronto..

é necessário atualizar o dao para carregar e salvar o detalhe...
no jsp a tag detalhe monta um datagrid com botoes para manipular os itens do detalhe... 


Rogel

Bom dia,

Me tira uma dúvida por favor, fiz este exemplo que vc mostrou mas quando mando salvar ele da o seguinte erro:

Code:
 * Hibernate operation: could not insert: [bean.OrcamentoServico]; SQL [insert into sis.orcamentoservico (observacao, orcamento_id, servico_id, valor) values (?, ?, ?, ?)]; Column 'orcamento_id' cannot be null; nested exception is com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Column 'orcamento_id' cannot be null
           o Integridade de dados violada
           o Column 'orcamento_id' cannot be null
 
 


O NEO não trata esse tipo de situação?

Abraços

Vinícius O. Janones
[Email]
vinicius.janones
Template
[Avatar]

Membro desde: 25/06/2007 12:55:10
Mensagens: 105
Localização: Uberlândia - MG
Offline

Rogel,

Quando abri a listagem após dar o erro anterior que postei, vi que o NEO tinha cadastrado somente o orçamento, agora as peças que cadastrei deram erro mesmo, mas ao clicar em editar ele gerou esse erro:

Code:
 failed to lazily initialize a collection of role: bean.Orcamento.pecas, no session or session was closed
 


E ainda deixou a tela toda desconfigurada...

Vinícius O. Janones
[Email]
vinicius.janones
Template
[Avatar]

Membro desde: 25/06/2007 12:55:10
Mensagens: 105
Localização: Uberlândia - MG
Offline

O erro do editar eu achei... eu tinha feito no mapeamento assim:

Code:
 cascade=CascadeType.ALL, fetch=FetchType.LAZY
 


Foi só remover essas opções e funcionou...

Mas quanto ao erro dos indices, por acaso posso fazer um Override no método saveOrUpdate no OrcamentoService para resolver isso?

Vinícius O. Janones
[Email]
pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

Utilize o método updateSaveOrUpdate para isto.

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
vinicius.janones
Template
[Avatar]

Membro desde: 25/06/2007 12:55:10
Mensagens: 105
Localização: Uberlândia - MG
Offline

Pedro,

Consegui aqui... ficou bacana.

A[]s

Vinícius O. Janones
[Email]
pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

vlw!

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
alexcampos
Equipe
[Avatar]

Membro desde: 26/09/2007 11:13:14
Mensagens: 7
Offline

rogel.garcia wrote:


...

no seu dao<Principal> vc teria que extender o método updateSaveOrUpdate assim:

Code:
 public void updateSaveOrUpdate(SaveOrUpdateStrategy save) {
     save.saveOrUpdateManaged("listaDetalhe");
 }
 


e também o updateEntradaQuery

Code:
 public void updateEntradaQuery(QueryBuilder<Principal> query) {
     query.fetchCollection("listaDetalhe");
 }
 


pronto..

é necessário atualizar o dao para carregar e salvar o detalhe...
no jsp a tag detalhe monta um datagrid com botoes para manipular os itens do detalhe... 


pessoal.... estou tentando fazer um detail por aqui mas depois que eu sobrescrevi os métodos do meu "dao<principal>" a tela de edição do meu "principal" passou apresentar o seguinte erro:

Code:
 
     * Erro ao inicializar Proxys (Coleções). br.com.linkcom.neo.controller.crud.CrudController.carregar(CrudController.java:264)
           o Erro ao tentar fazer fetch de listaImoveis em sca.proprietario.Proprietario
           o could not initialize a collection: [sca.proprietario.Proprietario.listaImoveis#1]
           o Table 'sca.proprietario_imovel' doesn't exist
 


no meu caso o objeto principal é "Proprietario" que tem uma ligação OneToMany com meu Detalhe, que é Imóvel (ManyToOne com Proprietario).

alguém tem alguma idéia de como resolver isso?

valeuz...

[]'s
pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

Manda o seu Bean e seu dao.

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
alexcampos
Equipe
[Avatar]

Membro desde: 26/09/2007 11:13:14
Mensagens: 7
Offline

Proprietário.java

Code:
 
 @Entity
 public class Proprietario implements Serializable {
 
     
     private Long id;
     private String nome;
     private Cpf cpf;
     
     private List<Imovel> listaImoveis;
 
     public Proprietario() {
     }
 
     public Proprietario(Long codProprietario) {
         this.id = codProprietario;
     }
 
      @OneToMany
     public List<Imovel> getListaImoveis() {
         return listaImoveis;
     }
 
     public void setListaImoveis(List<Imovel> listaImoveis) {
         this.listaImoveis = listaImoveis;
     }
 
     
     @Id
     @GeneratedValue(strategy=GenerationType.AUTO)
     public Long getId() {
         return id;
     }
 
     public void setId(Long id) {
         this.id = id;
     }
 
 ...
  
 



ProprietarioDAO.java

Code:
 
 
 public class ProprietarioDAO extends GenericDAO<Proprietario> {
 
     
     @Override
     public void updateSaveOrUpdate(SaveOrUpdateStrategy query) {
         query.saveOrUpdateManaged("listaImoveis");
     }
 
     
     @Override
     public void updateListagemQuery(QueryBuilder<Proprietario> query, FiltroListagem _filtro) {
         ProprietarioFiltro filtro = (ProprietarioFiltro) _filtro;
         query.whereLike("proprietario.nome", filtro.getNome())
              .where("proprietario.cpf = ?", filtro.getCpf());
     
     }
     @Override
     public void updateEntradaQuery(QueryBuilder<Proprietario> query) {
         query.fetchCollection("listaImoveis");
     }
     
 }
 
 




Imovel.java

Code:
 
 
 @Entity
 public class Imovel implements Serializable {
     
     
     private Long id;
     private String nome;
     private TipoImovel tipo;
     ...
     
     private Proprietario proprietario;
 
     public Imovel() {
     }
 
     public Imovel(Long id) {
         this.id = id;
     }
 
     public Imovel(Long id, String nome, int tipo, Money valorCondominio) {
         this.id = id;
         this.nome = nome;
        // this.tipo = tipo;
         this.valorCondominio = valorCondominio;
     }
 
     @Id
     @GeneratedValue(strategy=GenerationType.AUTO)
     public Long getId() {
         return id;
     }
 
     public void setId(Long id) {
         this.id = id;
     }
 
 
     @ManyToOne(fetch=FetchType.LAZY)
     public Proprietario getProprietario() {
         return proprietario;
     }
 
     public void setProprietario(Proprietario proprietario) {
         this.proprietario = proprietario;
     }
 
 ...
 
 




ImovelDAO.java

Code:
 
 
 public class ImovelDAO extends GenericDAO<Imovel> {
 
     @Override
     public void updateListagemQuery(QueryBuilder<Imovel> query, FiltroListagem _filtro) {
         ImovelFiltro filtro = (ImovelFiltro) _filtro;
         query.whereLike("imovel.nome", filtro.getNome())
              .where("imovel.tipo = ?", filtro.getTipo());
     
     }
 }
 

pedro.goncalves
Equipe
[Avatar]
Membro desde: 17/04/2007 16:12:20
Mensagens: 539
Localização: Belo Horizonte - MG
Offline

alex..

o seu mapeamento está errado..

o correto é assim:

Code:
 @OneToMany(mappedBy = "proprietario")
      public List<Imovel> getListaImoveis() {
          return listaImoveis;
      }
 

Pedro Gonçalves
http://pedrogoncalves.com.br
[Email] [WWW] [MSN]
alexcampos
Equipe
[Avatar]

Membro desde: 26/09/2007 11:13:14
Mensagens: 7
Offline

isso ai velho!
valeu msm!!

[]'s
tlink.k
Equipe
[Avatar]

Membro desde: 28/09/2007 16:06:19
Mensagens: 12
Offline

Olá, eu to fazendo um projeto de pesquisa na faculdade e "empaquei"....

provavelmente ja foi respondido tvz de alguma outra forma, mas nao estou conseguindo fazer/entender (comecei a pouco tempo com programacao para WEB e com NEO)

tenho tres classes ( Tecnico, Propriedade, e PropriedadeTecnico)

Tecnico
Code:
 private Long codigo;
  ...
 private Collection<PropriedadeTecnico> propriedadeTecnicoCollection;
 
 @OneToMany(cascade = CascadeType.ALL, mappedBy = "tecnico")
     public Collection<PropriedadeTecnico> getPropriedadeTecnicoCollection() {...}
 


TecnicoDAO
Code:
 public class TecnicoDAO extends GenericDAO<Tecnico>{
 @Override
     public void updateEntradaQuery(QueryBuilder<Tecnico> query) {
         query.fetchCollection("propriedadeTecnicoCollection");
     }
     
     @Override
     public void updateSaveOrUpdate(SaveOrUpdateStrategy save) {
         save.saveOrUpdateManagedNormal("propriedadeTecnicoCollection");
     }
 }
 


tecnicoEntrada.jsp
Code:
 <t:entrada>
     <t:janelaEntrada>
         <t:tabelaEntrada>
             <t:property name="codigo"/>
             <t:property name="nome"/>
             ....
         </t:tabelaEntrada>
         
         <t:detalhe name="propriedadeTecnicoCollection">
             <t:property name="propriedade"/>
             <t:property name="tecnico"/>
         </t:detalhe>
         
     </t:janelaEntrada>
 </t:entrada>
 


PropriedadeTecnico
Code:
 private Long codigo;
     private Short disponibilidade;
     private Propriedade propriedade;
     private Tecnico tecnico;
 
 @ManyToOne
     public Propriedade getPropriedade() {...}
 @ManyToOne
     public Propriedade getTecnico() {...}
 


Propriedade
Code:
 private Long codigo;
 ...
     private Collection<PropriedadeTecnico> propriedadeTecnicoCollection;
  private Collection<Viveiro> viveiroCollection;
 ...
 @OneToMany(cascade = CascadeType.ALL, mappedBy = "propriedade")
     public Collection<PropriedadeTecnico> getPropriedadeTecnicoCollection() {
 


propriedadeEntrada.jsp
Code:
 <t:entrada>
     <t:janelaEntrada>
         <t:tabelaEntrada>
             <t:property name="codigo"/>
             <t:property name="area"/>
             <t:property name="distancia"/>
         </t:tabelaEntrada>
 
 
     </t:janelaEntrada>
 </t:entrada>
 


agradeço a atençao
...
flw
 
Índice dos Fóruns -> Dúvidas Ir para a página: Anterior  1, 2, 3, 4 Próximo 
Ir para:   
Powered by JForum 2.1.7 © JForum Team