Fórum DER para sistema advogado #10848
30/10/2009
0
Andrei Hirata
Curtir tópico
+ 1Posts
30/10/2009
Henrique Weissmann
Qual a melhor forma de... ? Iniciar a elaboração do DER? Normalizar dados?
Gostei + 0
30/10/2009
Andrei Hirata
Gostei + 0
30/10/2009
Andrei Hirata
Exemplo
Advogado extends Pessoas
ja a classe pessoa fisica seria one to one pessoas
SOU MEIO RUIM NESTAS VISOES
Gostei + 0
30/10/2009
Andrei Hirata
Seria mais ou menos assim.Eu já tenho tudo pronto mas não sei se estou fazendo da melhor forma ou se existe melhores..
Gostei + 0
30/10/2009
Henrique Weissmann
a primeira coisa que você deve ter em mente ao fazer este tipo de mapeamento é o seguinte: os dados armazenados em um banco de dados são o resultado de um processamento computacional, e não o contrário (este é um erro muito comum cometido por ai).
No entanto, a abordagem contrária também é muito adotada: a de se criar as classes a partir de uma estrutura de banco de dados pré-existente. Se este segundo caso for o seu, segue aqui algumas dicas ok?
* No que diz respeito ao mapeamento das pessoas, você já fez isto corretamente em seu chamado anterior, atendido inicialmente pelo Dyego e finalizado comigo. Realmente é aquela história: os atributos que são comuns à todos os tipos de pessoas (ou seja, os atributos presentes na classe abstrata Pessoa) ficam em uma mesma tabela, e aqueles atributos que são específicos de uma determinada subclasse em uma classe separada (releia aquela nossa conversa anterior sobre este tópico).
No que diz respeito à criação geral das classes, no entanto, seguem aqui alguns pontos para lhe auxiliar:
* Os campos de suas tabelas que não são chaves estrangeiras devem ser mapeados como campos primitivos em suas classes. Sendo assim, por exemplo: você pode criar uma classe chamada Usuario, cujos dados se encontram armazenados na tabela usuarios. Esta tabela possui os seguintes campos:
Usuarios:
idPessoas: int
usuario: varchar(50)
senha: varchar(30)
idSys_Perfil: int (trata-se de uma chave estrangeira aqui).
A sua classe poderia ser definida portanto tal como
class Usuario {
private int id; // aponta para o seu campo idPessoas
private String login; // aponta para o seu campo usuario
private String senha; // aponta para o seu camop senha
public Perfil perfil; // aponta para o tipo de perfil. Lembre-se: aqui estamos tratando de uma chave estrangeira naquela tabela
}
* Dica: ao trabalhar com seu mapeamento, comece criando as classes que possuam o menor número de dependências externas provenientes de outras tabelas quanto possível. Com base no seu DER, por exemplo, você deveria primeiro mapear a classe Perfil (que citei acima) relacionada à tabela Sys_Perfil, para depois trabalhar com a classe Usuario.
* Sobre o mapeamento usando JPA (as famigeradas anotações), a melhor fonte que conheço é a documentação oficial, cujo tópico pode ser acessado diretamente neste link: http://java.sun.com/javaee/5/docs/tutorial/doc/bnbpz.html
Gostei + 0
30/10/2009
Henrique Weissmann
o seu diagrama já está bem bacana. O que você precisa agora é implementar as classes. Até agora, está indo corretamente, de acordo com o que vi neste e no chamado anterior.
Gostei + 0
30/10/2009
Andrei Hirata
No meu caso aqui. Fiz o seguinte nas classes
public class Advogados extends Pessoas implements Serializable {}
public class AdvogadosAdversos extends Advogados implements Serializable {}
public class Clientes extends Pessoas implements Serializable {}
public class ClientesAdversos extends Clientes implements Serializable {}
public class Usuarios implements Serializable {} //Observe que ela n é extendida, e sim uma relação one to one com pessoas.Mas o problema começa ae.
Eu preciso que APENAS o CLIENTE e o Advogado possa ser USUARIO, e nesta minha relação eu estou dizendo que TODAS PESSOAS podem ser usuários.
Pela programação não seria dificil resolver meu problema.Usando JPA, ele insere em Clientes,depois pessoas e atravez de uma logica eu mando inserir em usuarios MANUALMENTE. Não sei se isto é correto.Utilizei o mesmo caso para resolver aquele caso da pessoa juridica e pessoa fisica utilizando join entre pessoas Ao invez de classe extendida por herança
Bom.Será que to fazendo correto?
Usuário esta na DER corretamente?
o MEU INSERT manualmente é correto? ou estou fugindo das regras do JTA?
Gostei + 0
30/10/2009
Henrique Weissmann
entendi o problema. Neste caso, é fácil de resolver. Basta que as pessoas do tipo Advogado ou Cliente possuam um atributo do tipo Usuario E que nas respectivas tabelas exista uma chave estrangeira para a tabela usuarios.
Com relação a heranças, minha sugestão é a seguinte: quanto menos herança, melhor.
Gostei + 0
30/10/2009
Andrei Hirata
Se for isto.Vai ter um problema....QUando inserir advogado adversos,obrigatoriamente o jpa por herança vai
dar um insert em advogados QUE obrigatoriamente vai precisar o idusuario para que o cadastro ocorra com sucesso.Bom.aguardo resposta.--<<é oq acho q vai ocorrer teoricamente.
Gostei + 0
30/10/2009
Henrique Weissmann
seria isto. No entanto, você pode fazer com que a referência a tabela usuarios seja opcional.Neste caso, a sua aplicação trataria disto, e não o banco de dados.
Se bem que você tem razão neste ponto. Talvez seja melhor manter como estava anteriormente, porém configurar o link com a tabela usuarios a partir da sua aplicação como lógica de negócios da mesma.
Ou então, você pode também tratar isto dentro do seu próprio banco de dados usando triggers por exemplo. Mas isto é apenas uma idéia.
Gostei + 0
30/10/2009
Andrei Hirata
Em relação este chamado..
Não posso criar trigger.Pois estou trabalhando em cima de 2 bancos.Mysql e Postgres.Usar uma trigger quebraria o padrão de criar regras de negócios no ejb e passaria a criar no banco, e assim quebraria a regra de MULTIBANCO que é abortado na minha apresentação.
Como informado precisaria de uma solução que apenas o cliente e advogado fosse usuário no sistema.
O esquema que te passei, até funciona.Porém esta abordagem não é legal.
O esquema que vc me passou até resolve, mas acaba dando problema na hora de inserção, pois minha classes advogados,advogadosadversos e até pessoas estao com herança.
Aguardo uma solução.Não é urgente isto.
O mais urgente é aquele do ejb desktop.Abraços
Gostei + 0
30/10/2009
Henrique Weissmann
com relação ao chamado sobre ejb, pedi à moderação que o transferisse para o Dyego, que possui muito mais experiência no assunto do que eu.
Com relação ao nosso problema aqui neste post, uma solução poderia ser você definir o método setUsuario da sua classe abstrata Usuario como abstrato também.
Assim, se uma classe pode ter um usuário relacionado, basta que você a implemente tal como no exemplo abaixo:
public void setUsuario(Usuario usr) {
this.usuario = usr;
}
e caso não queira que determinado tipo de pessoa não tenha usuário, o definiria como
public void setUsuario(Usuario usr) {
// nao faça nada
}
Gostei + 0
30/10/2009
Andrei Hirata
Nao entendi sua explicação.Vc ta dizendo que Mantendo a abordagem do meu DER, devo criar minha classe usuario como abstrata
e sobrescrever meu metodo
public void setUsuario(Usuario usr) {
this.usuario = usr;
}
para
public void setUsuario(Usuario usr) {
// nao faça nada
}
?????????????????é isto? se sim vou precisar analisar e ver se funcionaria para meu caso...Porque mudar algo nas entidades pode ocasionar problemas nos meus SessionBean e manager beam das minhas telas..
Gostei + 0
30/10/2009
Henrique Weissmann
Na realidade, pelo que pude entender, você possui uma classe básica chamada Pessoas, a partir da qual diversas outras são baseadas: Advogado, Cliente, etc.
Pelo que pude ver até agora, alguns subtipos da classe Pessoa apenas que podem ter um usuário relacionado. No entanto, nem todas o podem ter, e você não quer implementar por exemplo o atributo usuario em todos os tipos de Advogado, correto?
O que propus para você fazer foi o seguinte: esta classe (Pessoas), ser declarada como abstrata. E o método set responsável por definir o atributo usuario ser declarado como abstrato (setUsuario). Sendo assim, para cada tipo de pessoa você poderia definir uma lógica de negócio específica que define se aquele tipo em questão pode ou não possuir um usuário relacionado.
Gostei + 0
30/10/2009
Andrei Hirata
1>
Na realidade, pelo que pude entender, você possui uma classe básica chamada Pessoas, a partir da qual diversas outras são baseadas: Advogado, Cliente, etc.
2>
Pelo que pude ver até agora, alguns subtipos da classe Pessoa apenas que podem ter um usuário relacionado.
2.1>
No entanto, nem todas o podem ter, e você não quer implementar por exemplo o atributo usuario em todos os tipos de Advogado, correto?
3>
O que propus para você fazer foi o seguinte: esta classe (Pessoas), ser declarada como abstrata. E o método set responsável por definir o atributo usuario ser declarado como abstrato (setUsuario). Sendo assim, para cada tipo de pessoa você poderia definir uma lógica de negócio específica que define se aquele tipo em questão pode ou não possuir um usuário relacionado.
ANALISANDO
1>Sim.Tenho uma classe abstrata Pessoa e outras classes advogado,advogadocontraria,cliente,clienteContrario e todos sao herancas.ja informado como esta as classes.
2>Correto.Apenas Advogados e Clientes serao usuarios.Advogados contrarios e clientes contrarios jamais deve ser usuarios do sistema.
2.1>Quase isto.Apenas os advogados podem ser usuarios e os advogados adversos NAO PODEM
3>A classe pessoa j'a 'e abstrata,e vc ta falando para colocar o METODO SET USUARIO como abstrato?oq isto mudaria?E em relacao a esta logica de negocio que define se aquele tipo pode ou nao ser usuario como seria isto?
DEIXXA EU FALAR COMO ESTA MINHA REGRA DE INSERT EM MODIFICAR NADA ATE AGORA
Se inserir em advogado adverso, meu jta inseri em advogado e em pessoa automaticamente.Atravez de uma regra de insert eu verifico o check box se 'e fisica e juridica e do um insert manualmente em pessoa fisica ou pessoa juridica .E na tabela usuario meu inset na tabela usuario 'e ignorado.Veja que funciona....
Quando eu der em advogados, acontece a mesma coisa, mas 'e dado um insert em usuarios
BOM.esta 'e a explicacao..Eu nao estou entendendo sua solucao.Gostaria se pudesse agora passar um codigo exemplo aqui apenas para facilitar oq vc ta querendo me passar.abra'cos
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)