Há como mapear uma classe no Hibernate sem declarar getters e setters (e com atributos privados)?

9 respostas
bonfarj

Vejam o que diz a documentação do Hibernate:

4.1.4. Declare accessors and mutators for persistent fields (optional)
Cat declares accessor methods for all its persistent fields. Many other ORM tools directly persist instance variables. We believe it is better to provide an indirection between the relational schema and internal data structures of the class. By default, Hibernate persists JavaBeans style properties, and recognizes method names of the form getFoo, isFoo and setFoo. You may switch to direct field access for particular properties, if needed.

Properties need not be declared public - Hibernate can persist a property with a default, protected or private get / set pair.

Pelo que eu entendi é possível fazer com que o Hibernate acesse diretamente atributos privados sem getters e setters, é isso mesmo? Caso positivo, como eu posso fazer isso?

9 Respostas

rdgms

Hibernate pode persistir os atributos que estão como default, protected OU private get / set

bonfarj

Hibernate pode persistir os atributos que estão como default, protected OU private get / set

Oi, rdgms!

Até aí tudo bem, atualmente eu mantenho meus atributos como private e crio getters e setters para todos eles. O problema é que para mim manter um atributo privado com getter e setter equivale a ter um atributo público, pois qualquer um pode ler e escrever, o acesso é irrestrito.

Acho que estou caindo na real, não há como o Hibernate manter atributos privados persistíveis sem getter e setter. Estou estou enganado ou o Hibernate nos atrapalha no encapsulamento? :frowning:

Abraços a todos,

R

só não entendi uma coisa, se vc criar uma classe sem gets e sets e com todos os atributos privados, como sua aplicação vai utilizar esta classe? ou como você vai popular seu objeto e jogar no hibernate para que ele possa cadastrar no banco. Acho que não é muito viável o que você esta tentando fazer.

fabiofalci

Tenta isso

http://www.hibernate.org/116.html#A20

bonfarj

Na minha opinião o mundo fora da classe não precisa conhecer suas propriedades, seus atributos. O que deve ficar público são os métodos que fazem uso destes atributos, abstraindo a forma como a classe funciona internamente, encapsulando. Getters e setters nada mais são do que métodos que permitem a leitura e escrita direta de um atributo. Se vc tem um atributo privado com getter e setter, na minha opinião (sempre ressalto!) vc tem um atributo público.

Com os métodos públicos, que fazem o elo entra a classe e o mundo exterior. Por exemplo, se vc tem uma classe ContaBancariae executa o método gerarExtrato(), vc não precisa saber que esta classe possui um atributo privado operacoes. Será que vc precisaria necessariamente de um getter para este atributo?

Esse é o ponto… caí na real, não vejo como. Como falei, para mim o Hibernate incentiva o “não encapsulamento”. :frowning:

Abraços!

bonfarj

fabiofalci:
Tenta isso

http://www.hibernate.org/116.html#A20

Wow, acho que é isso que eu preciso, vou testar e aviso aqui!! :wink:

bonfarj

Funcionou perfeitamente, esqueçam minha crítica ao hibernate ele voltou a ser sensacional pra mim! :smiley:

Abraços e muito obrigado!

R

usando seu exemplo da ContaBancaria, com certeza ela devera ter um atributo, provavelmente privado, saldo. Como você vai atribuir um saldo a esta conta e como outras classes de sua aplicação irá saber o saldo atual da conta se você não tem métodos de acesso para este atributo?

ps.: Quando eu falei em getts e setts, eu já sabia que são métodos de acesso aos atributos e também sei que por padronização utilizou-se estes nomes de métodos, obrigado pela explicação.

bonfarj

A rigor você não precisa de um atributo saldo, vc pode criar um método calcularSaldo() para obtê-lo através dos débitos e créditos na conta. E não estou dizendo que criar getters e setters e errado, longe disso, o que não acho certo é criar estes métodos sem necessidade, dar visibilidade aos atributos sem necessidade.

Abraços,

Criado 3 de novembro de 2008
Ultima resposta 5 de nov. de 2008
Respostas 9
Participantes 4