Diferença de usar anotação no metodo get ou no atributo

Alguém saberia me esclarecer qual a diferença entre fazer o mapeamento usando anotação no atributo ou no método get?

Exemplo:


@Id
private Long id;

public Long getId(){

    return id;
}


...........



private Long id;

@Id
public Long getId(){

    return id;
}

Não consegui compreender mesmo na referência do Hibernate, que segue abaixo.

Depending on whether you annotate fields or methods, the access type used by Hibernate will be field or property. The EJB3 spec requires that you declare annotations on the element type that will be accessed, i.e. the getter method if you use property access, the field if you use field access. Mixing annotations in both fields and methods should be avoided. Hibernate will guess the access type from the position of @Id or @EmbeddedId.

Obrigado

No livro Hibernate in Action ele diz que se vc anotar o atributo, ele vai acessar pelo atributo, se anotar o método get, vai acessar os valores via método get e set. Faça um teste prático pra comprovar, coloque nos métodos set and get um System.out. Aí vc salva e recupera do banco duas vezes, uma anotando o atributo, outra o método get.

[]s

[quote]No livro Hibernate in Action ele diz que se vc anotar o atributo, ele vai acessar pelo atributo, se anotar o método get, vai acessar os valores via método get e set. Faça um teste prático pra comprovar, coloque nos métodos set and get um System.out. Aí vc salva e recupera do banco duas vezes, uma anotando o atributo, outra o método get.

[]s[/quote]

Ok… E qual é mais eficiente? em questão de Performance.;;

[quote=mausexdd][quote]No livro Hibernate in Action ele diz que se vc anotar o atributo, ele vai acessar pelo atributo, se anotar o método get, vai acessar os valores via método get e set. Faça um teste prático pra comprovar, coloque nos métodos set and get um System.out. Aí vc salva e recupera do banco duas vezes, uma anotando o atributo, outra o método get.

[]s[/quote]

Ok… E qual é mais eficiente? em questão de Performance.;;[/quote]

Acredito que tanto faz, talvez anotando o atributo seja mais rapido…Eu particularmente prefiro anotar o atributo pois fica mais legivel o código

Acho que uma operação no banco é muito mais custosa que a diferença de uma chamada via Reflection de um atributo e um método set. Por essa razão, eu não me preocuparia com qual a melhor performance, e sim com qual opção atende a minha regra de negócio.

O pensamente em performance deve ser feito, em geral, no fim do projeto. Dessa maneira, você não perde tempo melhorando performance de uma porção do sistema que não é o gargalo.

Abs.

A diferença é que anotando o atributo no momento em que o objeto é instanciado todos seus atributos serão preenchidos, e se anotar o método apenas quando o método for chamado aquele atributo será preenchido.
Aprendi isso quando meus métodos equals e hashCode começaram a dar problema e eu não entendia o porque ¬¬

Eu prefiro colocar no atributo, por legibilidade e para garantir que tudo estará preenchido. Em casos de performance altero minhas queries para trazer apenas os dados necessários.

Eu prefiro anotar os atributos, até pra evitar sair criando get e set pra tudo (apesar que você pode criar getters protegidos / privados pras propriedades e colocar as anotações neles, mas não acho isso apropriado).

Bom sei que o topico já faz quase um mês sem atividade, mas só para esclarecer pra quem fizer buscas futuras.

O motivo para se colocar as annotations nos metodos gets pode ser por tratamento da informação ou algum calculo que deve ser feito antes que os valores sejam atribuidos a variavel.

um exemplo seria no caso de ser necessário fazer a soma de determinados campos e está soma não estar guardada no banco poderia ser feito assim

[code]
@Entity
public class DoBanco {

private int id;
private int valor1;
private int valor2;
private int soma = 0;

@Id
@GeneratedValue
public int getId() {
	return id;
}

public void setId(int id) {
	this.id = id;
}

@Column(name = "inicio")
public int getValor1() {
	return valor1;
}

public void setValor1(int valor1) {
	this.soma += this.valor1;
	this.valor1 = valor1;
}

@Column(name = "fim")
public int getValor2() {
	return valor2;
}

public void setValor2(int valor2) {
	this.soma += valor2;
	this.valor2 = valor2;
}

@Transient
public int getSoma() {
	return soma;
}

public void setSoma(int soma) {
	this.soma = soma;
}

}[/code]

Sei que não foi um exemplo tão bom mas foi só pra mostrar que você pode utilizar a anotação nos metodos para tratar situações especiais

Se você anotar o atributo em uma clase faça o mesmo para o restante da aplicação, o mesmo acontece para anotações no método get.
Ou seja escolha somente uma das alternativas.
Não vejo diferença técnica/performance entre as opções de anotação.