Hibernate Annotations

5 respostas
velo

Pessoas,

Teoricamente, com o hibernate annotations eu posso anotar os atributos ao invez do get/set, certo?

Agora pq o codigo:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	private List<Dimension> dimensions;

Dah o seguinte erro:

<blockquote>org.hibernate.MappingException: Could not determine type for: java.util.List, for columns: [org.hibernate.mapping.Column(dimensions)]

at org.hibernate.mapping.SimpleValue.getType(SimpleValue.java:266)

at org.hibernate.mapping.SimpleValue.isValid(SimpleValue.java:253)

at org.hibernate.mapping.Property.isValid(Property.java:185)

at org.hibernate.mapping.PersistentClass.validate(PersistentClass.java:440)

at org.hibernate.mapping.RootClass.validate(RootClass.java:192)

at org.hibernate.cfg.Configuration.validate(Configuration.java:1102)

at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1287)

at com.orzare.base.persistence.HibernateUtil.<clinit>(HibernateUtil.java:30)

… 19 more</blockquote>

Detalhe, annotando assim:

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	public List&lt;Dimension&gt; getDimensions() {
		return dimensions;
	}

Funciona!

5 Respostas

plentz

Não só teoricamente, na prática também. Tente recompilar a classe após colocar a annotation de volta pro atributo e teste novamente. O funcionamento é exatamente o mesmo.

Alexandre_Vilas_Boas

Oi Velo e Diego

Realmente o hibernate funciona quando você anota o atributo ou o getter, mas existe uma diferença no funcionamento que pode fazer toda diferença.(ficou boa a frase hein:))

Dependendo se você anota o atributo ou método, o tipo do acesso usado pelo Hibernate será o atributo ou o método. Portanto, se utilizarmos as anotações nos atributos e disponibilizarmos getters para eles, quando o hibernate for persistir ele não vai usar os métodos, exemplo:

setamos o atributo cpf com: [CPF removido]
nosso metódo getter remove a mascara

o que será gravado no banco?
isso, o cpf com a mascara, já se mudarmos as anotações para os métodos, o getter é chamado e será gravado sem a máscara. O mesmo vale para os setters.

O tipo de acesso usado pelo hibernate, vai levar em consideração a posição de @Id ou @EmbeddedId e misturar anotações em atributos e métodos deve ser evitado.

Particularmente achei isso excelente.

[]'s

velo

Estranho, testei isso ontem varias vezes annotando no atributo, nada de funcionar, tava me achando burro já. Passei pro get parou de dar erro!

Que versão do hibernate annotations vc uso pra testar?

Detalhe, só dá erro em coleções.

VELO

urubatan

só pra constar, a anotação funciona nos atributos se todas estiverem nos atributos (na verdade a que vira achave e diz se é em atributos ou geters é a @Id)
se o @Id estiver em um atributo, todas as outras também devem estar, se estiver em um getter idem …

o esquema é que não da pra misturar as coisas …

plentz

Pra futuras consultas fica a referência…

http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#d0e161

Porém, isso pode ser sobrescrito usando a anotação @AccessType do Hibernate.

http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#d0e2065

Criado 15 de março de 2007
Ultima resposta 16 de mar. de 2007
Respostas 5
Participantes 4