Relacionamento ManyToOne não persiste

26 respostas
O

Srs.

Tenho aqui uma estrutura de relacionamento da seguinte forma.

A tabela abstrata Pessoa.

Código:

@Entity
@Table(name = "pessoa")
@Inheritance (strategy=InheritanceType.JOINED)
@DiscriminatorColumn (name="tipo",discriminatorType=DiscriminatorType.CHAR, length=1)
@DiscriminatorValue (value="M")

public abstract class Pessoa implements Serializable{}

@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa")
private Matriz matriz;
   
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa")
private Filial filial;

A tabela Matriz extendendo Pessoa.

Código:

@Entity
@Table(name = "matriz")
@DiscriminatorValue (value="M")
public class Matriz extends Pessoa implements Serializable {}

@OneToOne
@JoinColumn(name = "codigo", referencedColumnName = "codigo")
private Pessoa pessoa;

@OneToMany(mappedBy = "matriz", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Collection<Filial> filial;

A tabela Filial extendendo Pessoa e relacionando-se com a Matriz.

Código:

@Entity
@Table(name = "filial")
@DiscriminatorValue (value="F")
public class Filial extends Pessoa implements Serializable {}

@OneToOne
@JoinColumn(name = "codigo", referencedColumnName = "codigo")
private Pessoa pessoa;

@ManyToOne
@JoinColumn(name = "cod_matriz", referencedColumnName = "codigo", nullable = false)
private Matriz matriz;

O relalcionamento de herança esta funcionando corretamente entre as três tabelas, acontece que o relacionamento entre a Filial e a Matriz, quando se tenta persistir a classe Filial, simplesmente o atributo cod_matriz sempre grava no banco como null, não há nenhum tipo de erro, todos os outros atributos da classe são persistidos sem nenhum problema.

Será que este tipo de relacionamento (Filial x Matriz) é permitido no Toplink + JPA ?

Há alguma anotação específica para o relacionamento ManyToOne entre Filial e Matriz que seja necessária, levando-se em conta que as duas classes herdam de Pessoa ?

Abraços

Olavo Jr.

26 Respostas

S

Será que o erro está no mapeamento?
Qual o trecho da gravação no banco?
Veja se ajuda http://tramos.railsplayground.net/2007/11/29/hibernate-exemplo-com-heran-a

[]'s

O

Caro Scheide,

Não acredito que o problema esteja na persistência, deva ser no relacionamento e fica difícil identificar pois não  erros por parte do Toplink e nem do JPA.
Com relação a persistência ou seja a gravação no banco é bem simples veja os trechos de código:

Método da classe de interface com o usuário…

if (jb1.getText() == "Salvar"){
						if (GnsCtrGrs1b.getSalvaFilial(jt02.getText(), jt03.getText(), jt04.getText(), jt05.getText(), jt06.getText().trim().replaceAll("[./-]",""), jt07.getText().trim().replaceAll("[()-]",""), jt08.getText().trim().replaceAll("[()-]",""),
								jt09.getText(), jt10.getText(), jt11.getText(), jt12.getText().trim().replaceAll("[-]",""), jt13.getText(), jcb1.getSelectedItem().toString(), jcb2.getSelectedItem().toString(), matriz, jck1.isSelected()) == true){
							JOptionPane.showMessageDialog(null, "Registro salvo com sucesso !", "Salva Registro", JOptionPane.INFORMATION_MESSAGE);
							limpaJTextFields();
						}
						else{
							JOptionPane.showMessageDialog(null, "Este registro não foi salvo, verificar possíveis pro- \n blemas entre a conexão com o Banco de Dados !", "Grava Registro", JOptionPane.ERROR_MESSAGE);
						}
					}

Método da classe de apoio a persistência.

// Criando a classe para ser persistida.
	public static boolean getSalvaFilial(String razao_social, String nome_fantasia, String insc_estadual, String insc_municipal, 
			String cgc, String telefone, String fax,String data_cadastro, String rua, String bairro, String cep, String cidade,
			String pais, String uf, Matriz matriz, boolean situacao){

		boolean ok = true;
		try {
			// Instância Classe de persistência e adiciona seus atributos.
			Filial filial = new Filial();

			filial.setRazaoSocial(razao_social);
			filial.setNomeFantasia(nome_fantasia);
			filial.setInscEstadual(insc_estadual);
			filial.setInscMunicipal(insc_municipal);
			filial.setCpfCnpj(cgc);
			filial.setTelefone(telefone);
			filial.setFax(fax);
			filial.setRua(rua);
			filial.setBairro(bairro);
			filial.setCep(cep);
			filial.setCidade(cidade);
			filial.setPais(pais);

			if (uf == "Outros estados")
				filial.setUf("OU");
			else
				filial.setUf(uf);
			
			filial.setMatriz(matriz);
			filial.setSituacao(situacao);

			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
			Date data;
			data = sdf.parse(data_cadastro);
			filial.setDataCadastro(data);
			
			// Instância a Classe de Conexão com o Banco de Dados.
			if ((GnsSvrGrs1a.getInstancia().getSalvaObjeto(filial)) == false)
			{
				ok = false;
			}
		} catch (ParseException e) {
			e.printStackTrace();
			ok = false;
		}
		return ok;
		
	}// getSalvaFilial.

Método da classe de persistência.

// Método para salvar objeto no Banco de Dados.
    public Boolean getSalvaObjeto (Object object){
    	
    	em.getTransaction().begin();
    
    	try 
    	{
    		em.persist(object);
    		em.getTransaction().commit();
    		return true;
    		
    	} catch (Exception e){
    		e.printStackTrace();
    		em.getTransaction().rollback();
    		return false;
    	} 
    }// getSalvaObjeto.
Os métodos são simples, o problema a meu ver está entre o Toplink e o JPA, também não consegui encontrar um mesmo caso de relacionamento em buscas na internet para confrontar... está difícil de identificar o problema...

Agradeço a ajuda...

Olavo Jr.

Lavieri

para persistir os campos de um sub-classe em uma super-classe a sub-classe deve ter a anotação

@MappedSuperclass… pra falar a verdade não lembro exatamente o nome da anotação, olhe na API do javax.persistence.*;

//... @MappedSuperclass //&lt;== esta faltando essa anotação aki //... public abstract class Pessoa implements Serializable{ //... }

com esta anotação, vc avisa que esta classe faz parte de uma entidade mapeada, na qual é definda onde mapear pela sua super-classe … e diz tb que seus campos devem ser conciderados tb no mapeamento…

EDIT.: olhei o nome é @MappedSuperclass … corrigi mais a cima

API = http://java.sun.com/javaee/5/docs/api/javax/persistence/MappedSuperclass.html

idev4web

Se eu entendi corretamente, matriz tem varias filiais, certo?
e quando voce persiste uma filial o id da matriz fica nulo

Tente fazer da seguinte forma:

de um merge na filial pegue o objeto de retorno do merge.
passe a matriz para o metodo set matriz da filial que voce deu o merge (para setar o relacionamento)

e de um novo merge.

O

Caro Lavieri,

A questão do @MappedSuperclass não se aplica ao meu problema, se bem entendi em [url]http://www.oracle.com/technology/products/ias/toplink/jpa/resources/toplink-jpa-annotations.html#MappedSuperclass[/url] todos os campos de persistência estão definidos em cada entidade.
Como não custava nada fiz a inclusão da anotação e não obtive sucesso.

Abraços

Olavo Jr.

O

Caro idev4web,

Foi o que fiz imediatamente após identificar o problema, e também sem sucesso,  gravei o registro sem o atributo do cod_matriz, recuperei do banco setei somente o cod_matriz e tentei gravar novamente e sem sucesso.
E o incrível é que não  mensagem de erro... Estou tentando seguir o processo no debuguer do Eclipse, mais ainda nada...

Abraços

Olavo Jr.

Lavieri

perceba o seguinte...

Pessoa.class
@Entity  
@Table(name = "pessoa")  
@Inheritance (strategy=InheritanceType.JOINED)  
@DiscriminatorColumn (name="tipo",discriminatorType=DiscriminatorType.CHAR, length=1)  
@DiscriminatorValue (value="M")  
@MappedSuperclass //use isso! se é abstract então é MappedSuperclass
public abstract class Pessoa implements Serializable{}  
  
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa")  
private Matriz matriz;  
     
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa")  
private Filial filial;

e sim use @MappedSuperclass

aki vc ja definiu a propriedade matriz... se quiser alterar vai ter que usar uma anotação chamada AtributeOverride
eu ja usei e sei que funciona

http://java.sun.com/javaee/5/docs/api/javax/persistence/AttributeOverride.html
http://java.sun.com/javaee/5/docs/api/javax/persistence/AttributeOverrides.html

nesse seu caso talvez vc tenha que usar o AssociateOverride
que eu nunca usei, então não sei bem como é, mas da uma olhada na API

http://java.sun.com/javaee/5/docs/api/javax/persistence/AssociationOverride.html
http://java.sun.com/javaee/5/docs/api/javax/persistence/AssociationOverrides.html

espero que solucione

ralphsilver

pelo que eu entendi, vc está jogando a classe Filial para ser persistida… Nessa caso… o atributo cascade tem que estar nele.

O

Caro ralphsilver,

Já havia feito este teste, com combinações dos atributos do relacionamento cascade e fetch mesmo ao meu ver e pelo pouco de li não havendo necessidade para este padrão de relacionamento. E novamente não persistiu a classe Filial o atributo cod_matriz.

Veja uma destas combinações...
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinColumn(name = "cod_matriz", referencedColumnName = "codigo")
    private Matriz matriz;

Abraços

Olavo.

Lavieri

usou os atributeoverride ? ou associeteoverride ?

O

Caro Lavieri,

Estou aqui tentando estudá-los e executando-os, no meu humilde conhecimento estes atributos (@AttributeOverride e @AssociationOverride) não se aplicam se caso houvesse necessidade de usar valores diferentes dos estabelecidos pela superclasse ?

Meu problema não está no relacionamento de herança entre Matriz x Pessoa aqui é OneToOne e funciona bem, e nem entre Filial x Pessoa aqui também é OneToOne e também funciona. O problema é que embora as duas classes se relacionem com Pessoa no padrão de herança existe um relacionamento entre elas Filial x Matriz OneToMany e é justamente este que não está funcionando, quando estou com as classes intânciadas funciona perfeitamente, mas não é persistido no banco...

Não sei se me faço entender, é que quando mais vemos o mesmo assunto parece que começa a nos fugir detalhes...

Abraços

Olavo Jr.

Lavieri
Olavo-Brito:
Caro Lavieri,

Estou aqui tentando estudá-los e executando-os, no meu humilde conhecimento estes atributos (@AttributeOverride e @AssociationOverride) não se aplicam se caso houvesse necessidade de usar valores diferentes dos estabelecidos pela superclasse ?

Meu problema não está no relacionamento de herança entre Matriz x Pessoa aqui é OneToOne e funciona bem, e nem entre Filial x Pessoa aqui também é OneToOne e também funciona. O problema é que embora as duas classes se relacionem com Pessoa no padrão de herança existe um relacionamento entre elas Filial x Matriz OneToMany e é justamente este que não está funcionando, quando estou com as classes intânciadas funciona perfeitamente, mas não é persistido no banco...

Não sei se me faço entender, é que quando mais vemos o mesmo assunto parece que começa a nos fugir detalhes...

Abraços

Olavo Jr.

não funciona, e nunca funcionará pelo que estou vendo.... olhe bem para as suas classes

Pessoa.java
@Entity  
@Table(name = "pessoa")  
@Inheritance (strategy=InheritanceType.JOINED)  
@DiscriminatorColumn (name="tipo",discriminatorType=DiscriminatorType.CHAR, length=1)  
@DiscriminatorValue (value="M")  
  
public abstract class Pessoa implements Serializable{}  
  
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa")  
private Matriz matriz;  //<<<<<========= VEJA ISSO!!!!!
     
@OneToOne(cascade = CascadeType.ALL, mappedBy = "pessoa")  
private Filial filial;
Filial.java
@Entity  
@Table(name = "filial")  
@DiscriminatorValue (value="F")  
public class Filial extends Pessoa implements Serializable {}  
  
@OneToOne  
@JoinColumn(name = "codigo", referencedColumnName = "codigo")  
private Pessoa pessoa;  
  
@ManyToOne  
@JoinColumn(name = "cod_matriz", referencedColumnName = "codigo", nullable = false)  
private Matriz matriz;  //<<<<<========= VEJA ISSO!!!!!

perceba os dois comentarios "[color=green]//<<<<<========= VEJA ISSO!!!!![/color]"

percebe o que estou falando ?? 2 atributos iguais, na mesma classe (mesma classe pq a segunda extende a primeira, logo é como se o código continuasse) so podem existir se um for Overite do outro... e se esse não é o caso, vc deve trocar o nome do segundo relacionamento, caso contario nunca tera sucesso

a classe Filial tem 2 atributos chamado matriz, uma da superclasse e outro dela mesma, e boviamente um dos dois ia acabar saindo null sempre, o.O
se deseja sobrescrever o atributo use Override, se não deseja, crie um atributo diferente, e não use o mesmo da superclasse

.... o mesmo ocorre com a sua classe Matriz e pessoa, porem nela o atributo override é o atributo Filial, que deixa de ser 1-1 e vira 1-N ... enfim, não sei exatamente o que queria com esse mapeamento via herença, acho muito estranho ele, mas não to questionando isso, so estou querendo mostrar com o JPA interpreta esse seu mapeamento, e que pra ele um dos atributos vai acabar sumindo

O

Caro Lavieri,

Realmente não tinha enxergado desta forma, você está com a razão, vou fazer testes aqui sobrescrevendo atributos/métodos ou mesmo mudando o nome do atributo. está me ajudando muito e sou grato por isso.

Abraços,

Olavo Jr.

Lavieri

Eu não sei exatamente o que vc ker fazer com essa herança, e pq vc chamou a superclasse de Pessoa…

sei que o pessoal tem a mania de fazer herança entre PessoaFisica e PessoaJuridica (o que eu discordo radicalmente) … afinal um Pessoa e uma Empresa são duas coisas totalmente diferentes, independente de terem esse nome em comum de PF e PJ …

mas enfim, cada um com seus relacionamentos malucos o.O e nomes de tabelas malucos

O

Caro Lavieri,

A solução do problema realmente era bem simples, simplesmente alterei o nome do atributo matriz da classe Filial e tudo se resolveu (tentei usar as anotações @AttributeOverride e @AssociationOverride) na classe Filial mas sem sucesso. Enfim as vezes depois de tanto se olhar para um mesmo problema esquecemos de atentar-nos para os detalhes...
Com relação ao tipo de relacionamento Pessoa, uso esta classe abstrata (assim como uma tabela com o mesmo nome) para centralizar todos os atributos que são comuns entre as classes de persistência, veja até agora para o projeto que estou desenvolvendo ainda em fase inicial para as classes Matriz, Filial, Usuário, Vendedor, e deverão ser acrescidos a esta lista muitas outras classes, os atributos como (rua, bairro, cep, cidade, pais, telefone, data do cadastro, codigo e situação) que são comuns a todos deixo tudo nesta classe Pessoa isto me ajuda na organização, manutenção e tamanho das tabelas geradas.

Mais uma vez obrigado pela grande ajuda,

Abraços

Olavo Jr.

Lavieri

acho uma abordagem estranha, mas cada qual, com seu cada um ^^ …

Acredito que é possivel descentralizar as classes, e prefiro essa abordagem, eu prefiro ter objetos comuns usado em varios pontos, do que criar esse tabelão central, mas enfim, depois de tanto olhar para a classe, e não ver 2 atributos com o mesmo nome, acredito q talvez, vc esteja um pouco esgotado hehe, então deixamos essas discuções para outro momento…

O atributeOverride funciona quando este é o caso, quando vc pretende subrescrever um atributo definido na superclasse em uma subclasse…

E lembrando do assunto de mappedsuperclasse seu caso pelo que vc comentou, não usa realmente MappedSuperclasse, ja que vc comentou centralizar a tabela principal de “pessoa” …

bom que vc tenha solucionado o problema…

Por exemplo, eu não consigo enxergar como objetos difernte de varias pessoas, que criam N objetos para Pessoa, Usuario, Vendedor, Colaborador, Gerente… Matriz, Filial, Fornecedor etcc

eu prefiro a abordagem Simples

Pessoa

onde uma pessoa pode ser um Vendedor, Coaborador, um Usuario etc etc… existem dados mais especificos de Usuario, e quando os quero faço, pessoa.getUsuario() … e trabalho com essa classe Usuaria, que é uma tabela especializa de Pessoa… Porem Pessoa e Usuario são coisas diferentes…

o mesmo faço com as Empresas

Empresa

onde esta empresa, pode ser uma matriz, e o sendo ela tem varias outras empresas filiais ligadas a ela, uma empresa pode ser tb uma fornecedora, ou ata mesmo outra coisa…

porem todas são empresas, e as informações por exemplo, de fornecimento, são resgatas, se houver, através do objeto Fornecedor, que tem uma relação de 1-1 com empresa, porem não extende a empresa, prefiro essa abordagem

idev4web

Tente este exemplo:

@Entity
public class Pessoa implements Serializable {
	@Id
	@GeneratedValue(generator="pessoa_id_seq", strategy=GenerationType.SEQUENCE)
	@SequenceGenerator(name="pessoa_id_seq", sequenceName="pessoa_id_seq", allocationSize=1)
	private Long id;

	private String nome;

	private String email;

	@OneToMany(mappedBy="idPessoa", cascade=CascadeType.ALL,fetch=FetchType.EAGER)
	private Set<Telefone> telefoneCollection = new HashSet<Telefone>();

pessoa tem varios telefones

@Entity
public class Telefone implements Serializable {
	@Id
	@GeneratedValue(generator="telefone_id_seq", strategy=GenerationType.SEQUENCE)
	@SequenceGenerator(name="telefone_id_seq", sequenceName="telefone_id_seq", allocationSize=1)
	private Long id;

	private String codigo;

	private String numero;

	@ManyToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="id_pessoa")
	private Pessoa idPessoa;

aqui vai o código que adiciona telefone para a pessoa

pessoa = pessoaDAO.findById(pessoa.getId());
		
		telefone.setIdPessoa(pessoa);
		pessoa.getTelefoneCollection().add(telefone);
		
		pessoaDAO.merge(pessoa);
ralphsilver

Lavieri:
Eu não sei exatamente o que vc ker fazer com essa herança, e pq vc chamou a superclasse de Pessoa…

sei que o pessoal tem a mania de fazer herança entre PessoaFisica e PessoaJuridica (o que eu discordo radicalmente) … afinal um Pessoa e uma Empresa são duas coisas totalmente diferentes, independente de terem esse nome em comum de PF e PJ …

mas enfim, cada um com seus relacionamentos malucos o.O e nomes de tabelas malucos

Bom Lavieri, nesse caso eu discordo com você em partes porque já precisei desenvolver projetos em que uma pessoa poderia cadastrar tanto pessoa física quanto jurídica. E essa associação fez justo o uso porque eu podia buscar os dois de uma vez para relatórios. O projeto era para um sistema de gerenciamento de compra e venda de uma loja de informática =] .

ralphsilver

Lavieri:
Eu não sei exatamente o que vc ker fazer com essa herança, e pq vc chamou a superclasse de Pessoa…

sei que o pessoal tem a mania de fazer herança entre PessoaFisica e PessoaJuridica (o que eu discordo radicalmente) … afinal um Pessoa e uma Empresa são duas coisas totalmente diferentes, independente de terem esse nome em comum de PF e PJ …

mas enfim, cada um com seus relacionamentos malucos o.O e nomes de tabelas malucos

Bom Lavieri, nesse caso eu discordo com você em partes porque já precisei desenvolver projetos em que uma pessoa poderia cadastrar tanto pessoa física quanto jurídica. E essa associação fez justo o uso porque eu podia buscar os dois de uma vez para relatórios. O projeto era para um sistema de gerenciamento de compra e venda de uma loja de informática =] .

ralphsilver

Lavieri:
Eu não sei exatamente o que vc ker fazer com essa herança, e pq vc chamou a superclasse de Pessoa…

sei que o pessoal tem a mania de fazer herança entre PessoaFisica e PessoaJuridica (o que eu discordo radicalmente) … afinal um Pessoa e uma Empresa são duas coisas totalmente diferentes, independente de terem esse nome em comum de PF e PJ …

mas enfim, cada um com seus relacionamentos malucos o.O e nomes de tabelas malucos

Bom Lavieri, nesse caso eu discordo com você em partes porque já precisei desenvolver projetos em que uma pessoa poderia cadastrar tanto pessoa física quanto jurídica. E essa associação fez justo o uso porque eu podia buscar os dois de uma vez para relatórios. O projeto era para um sistema de gerenciamento de compra e venda de uma loja de informática =] .[/quote]

Lavieri

ralphsilver:
Lavieri:
Eu não sei exatamente o que vc ker fazer com essa herança, e pq vc chamou a superclasse de Pessoa…

sei que o pessoal tem a mania de fazer herança entre PessoaFisica e PessoaJuridica (o que eu discordo radicalmente) … afinal um Pessoa e uma Empresa são duas coisas totalmente diferentes, independente de terem esse nome em comum de PF e PJ …

mas enfim, cada um com seus relacionamentos malucos o.O e nomes de tabelas malucos

Bom Lavieri, nesse caso eu discordo com você em partes porque já precisei desenvolver projetos em que uma pessoa poderia cadastrar tanto pessoa física quanto jurídica. E essa associação fez justo o uso porque eu podia buscar os dois de uma vez para relatórios. O projeto era para um sistema de gerenciamento de compra e venda de uma loja de informática =] .

[/quote]

é so que ai vc esta esquecendo de escalabilidade e mantenabilidade, e mudanças futuras no projeto serão bem deificeis, por exemplo, se o projeto crescer e vc precisar dividir o que é Empresa e o que são as pessoas vai sofrer mais do que se tivesse divido bem as tabelas…

e fazer um relatorio incluindo tudo, é so dar select nas duas tabelas hora, as das pessoas e das empresas…

ralphsilver

Lavieri:
ralphsilver:
Lavieri:
Eu não sei exatamente o que vc ker fazer com essa herança, e pq vc chamou a superclasse de Pessoa…

sei que o pessoal tem a mania de fazer herança entre PessoaFisica e PessoaJuridica (o que eu discordo radicalmente) … afinal um Pessoa e uma Empresa são duas coisas totalmente diferentes, independente de terem esse nome em comum de PF e PJ …

mas enfim, cada um com seus relacionamentos malucos o.O e nomes de tabelas malucos

Bom Lavieri, nesse caso eu discordo com você em partes porque já precisei desenvolver projetos em que uma pessoa poderia cadastrar tanto pessoa física quanto jurídica. E essa associação fez justo o uso porque eu podia buscar os dois de uma vez para relatórios. O projeto era para um sistema de gerenciamento de compra e venda de uma loja de informática =] .

é so que ai vc esta esquecendo de escalabilidade e mantenabilidade, e mudanças futuras no projeto serão bem deificeis, por exemplo, se o projeto crescer e vc precisar dividir o que é Empresa e o que são as pessoas vai sofrer mais do que se tivesse divido bem as tabelas…

e fazer um relatorio incluindo tudo, é so dar select nas duas tabelas hora, as das pessoas e das empresas…

Concordo em partes. Um projeto com relacionamento bem estruturado não precisaria. Concordo plenamente com você que em questão de atributos PF e PJ não tem nada a ver. Mas referente à regra de negócios, pessoas físicas podem fazer a mesma coisa que pessoa juridica, como por exemplo abrir conta em banco. Olhando o seu lado eu concordo que em casos nem seja viável usar essa relação. Há um projeto que eu estou enquadrado de Sistema Academico. Não tem o porque eu colocar uma relação de pessoa fisica e juridica (Unidades), pois nunca vou precisar pegar os dados simultaneos. Mas para encapsulamento e reuso de software, pra mim o mais viável é usar essa relação, por padrão.

Lavieri

é o que te falei, aquilo que vc simplifica hoje é o que vai te complicar amanha e em dobro…

Empresas e Pessoas podem ter contas, mas isso não fazem delas a mesma coisa…

Helicoptoros e Aves podem voar, mais isso não fazem delas a mesma coisa, no maximo compartilham uma mesma interface Flayer mas nunca serão um mesmo objeto…

Forçar uma Empresa e Pessoas a serem a mesma coisa pode te custar muita dor de cabeça…

vc pode forçar o modelo da forma como quiser, mas terá que arcar com as consequencias desse ato, pq no fundo, o modelo da tal loja de informatica, sabe muito bem, que uma Empresa e uma Pessoa são coisas diferentes, e é só o sistema se tornar maior que o cara vai começar a enxergar os pontos criticos de abordar as duas coisas como uma só…

Você pode ter uma interface Cliente, onde tanto uma Empresa, como uma Pessoa, possam assinar, mais dai a afirmar só pq os 2 são clientes, que eles são um único objeto, é forçar um modelo em um ZOOM muito grande, e se o projeto crescer, quando vc for dar o “ZOOM OUT” vai perceber, que aquela abordagem para o restante do modelo é falha, e provavelmente vai ter q reescrever muita coisa q tinha escrito…

Escalabilidade e Mantenabilidade é isso, prever essas cosias, e vc pode argumentar coisas como, “Mas o projeto era pequeno e nunca iria crescer”, projeto pode ser pequeno para aquela empresa, mas o código vc ja escreveu, e se for trabalhar com outra empresa maior, aquelo que vc ja fez tem q servir de base, reutilização é uma das premissas do OO … começar do zero seria pessimo…

E é so vc pensar, e verá que será extremamente dificil pensar em um projeto onde não exista Pessoas / Empresas nele, então ja mapei e modela tudo bunitinho, q ja vai server pra seus N projetos

EDIT.: e é pensando na reutilização que eu faço esses objetos em “Modulos” endereço é um objeto separado, que tanto uma Pessoa como um Empresa pode ter esse objeto Endereço, o mesmo serve para Telefone, etc etc etc… e assim vou fazendo, a depender da complexividade do projeto, vc pode utilizar + ou - modulos do objeto …

O

Caro Lavieri,

Realmente não estou "stressado", o que estou é aprendendo a desenvolver em Java OO, sou muito novo em java, comecei a desenvolver e aprender agora em janeiro/2009. Estou com um projeto aqui na empresa de desenvolver um ERP completo para o seguimento de terceirização de serviços. E meu primeiro módulo é o de vendas, estou utilizando como IDE o Eclipse junto com SWING, Toplink, JPA e iReport.
Trabalho com desenvolvimento a muito tempo (uns 18 anos +ou-), comecei pelo caracter, depois fui pro procedural e agora estou entrando definitivamente no OO, são paradigmas quebrados todos os dias, estou com um pouco de dificuldades de deixar de pensar "procedural" e começar a pensar em "oo", mais é uma trajetória longa até me desvincular dos modelos antigos, nada que a prática me forneça.
Com relação a classe Pessoa, também vejo as outras classes que herdam da Pessoa como classes mais especializadas, tanto é que para cada sub-classe, apenas trato de atributos inerentes a sua competência. Também vejo que trabalhar com "OO" quando mais divida as responsabilidades entre as classes tanto melhor pro futuro, mas estou me sentindo seguro da forma como está caminhando o projeto, e sempre temos a oportunidade de voltar e rever o que foi feito e melhorar...
O segredo do desenvolvimento é muita paciência e dedicação...

Abraços

Olavo Jr.

Lavieri

Olavo-Brito:
Caro Lavieri,

Realmente não estou "stressado", </blockquote>

é q as vezes ficar olhando e não ver uma coisa simples estressa um pouco … mas é o q vc falou, de tanto olhar para um mesmo problema é dificil notar os pequenos problema, e é por isso que sempre se entrega um trabalho para outra pessoa corrigir o texto, depois de fazer vc lê no automatico, e dificilmente econtra problemas…

Olavo-Brito:
o que estou é aprendendo a desenvolver em Java OO, sou muito novo em java, comecei a desenvolver e aprender agora em janeiro/2009. Estou com um projeto aqui na empresa de desenvolver um ERP completo para o seguimento de terceirização de serviços. E meu primeiro módulo é o de vendas, estou utilizando como IDE o Eclipse junto com SWING, Toplink, JPA e iReport.
Trabalho com desenvolvimento a muito tempo (uns 18 anos +ou-), comecei pelo caracter, depois fui pro procedural e agora estou entrando definitivamente no OO, são paradigmas quebrados todos os dias, estou com um pouco de dificuldades de deixar de pensar “procedural” e começar a pensar em “oo”, mais é uma trajetória longa até me desvincular dos modelos antigos, nada que a prática me forneça.
Com relação a classe Pessoa, também vejo as outras classes que herdam da Pessoa como classes mais especializadas, tanto é que para cada sub-classe, apenas trato de atributos inerentes a sua competência. Também vejo que trabalhar com “OO” quando mais divida as responsabilidades entre as classes tanto melhor pro futuro, mas estou me sentindo seguro da forma como está caminhando o projeto, e sempre temos a oportunidade de voltar e rever o que foi feito e melhorar…
O segredo do desenvolvimento é muita paciência e dedicação…

Abraços

Olavo Jr.

bem vindo ao mundo OO … realmente com tanto experiencia é complicado as trajetorias e as quebras de paradigma, mas nada q a força de vontade não mova ^^ … acredito que o mais complicado, neste pouco que vc falou, seja para de pensar em um modelo orientado ao banco de dados e passar a pensar num modelo orientado a objetos…

boa sorte ai no seu projeto, e aki no forum a turma ajuda muito

e algumas coisas interessantes sobre OO e Java vc pode encontrar aqui => http://sergiotaborda.wordpress.com/

O

Caro Lavieri,

Realmente a minha maior dificuldade é parar de pensar no banco de dados e começar a me concentrar nos objetos, em OO o banco é apenas uma conseqüência natural das transações entre as classes.
Fiquei surpreso realmente com o padrão de colaboração deste fórum, agradeço a todos que contribuíram.
Tenho outras dúvidas, mas antes de pedir ajuda gosto de gastar um pouco de fosfato, se não conseguir ou o tempo me forçar peço ajuda...

Abraços

Olavo Jr.

Criado 13 de maio de 2009
Ultima resposta 15 de mai. de 2009
Respostas 26
Participantes 5