views:

58

answers:

2

Where do i put my hibernate annotations?

Is it the line above my instance variable? Or before the getter? Or before the setter? Or doesn't it really matter?

Thanks a lot

+2  A: 

It's up to your style. You may put it before the field or before getter. In strict JPA, the annotations on setters are ignored, but I'm not sure if Hibernate follows that.

You either need to be consistent throughout your Entity, or you need to provide an @Access annotation at the top of the class with a default mode, and another @Access before each field/property you wish to deviate from the current class mode.

Brian M. Carr
+1  A: 

You place them either on the field or on the getter. From the Hibernate Annotations Reference Guide:

2.2.1. Marking a POJO as persistent entity

(...)

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.

You might also want to read about the @Access annotation that allows to force/override the access type (prior to Hibernate Annotations 3.5 and JPA 2.0, it was part of Hibernate Annotation Extensions):

2.2.2.2. Access type

By default the access type of a class hierarchy is defined by the position of the @Id or @EmbeddedId annotations. If these annotations are on a field, then only fields are considered for persistence and the state is accessed via the field. If there annotations are on a getter, then only the getters are considered for persistence and the state is accessed via the getter/setter. That works well in practice and is the recommended approach.

Note

The placement of annotations within a class hierarchy has to be consistent (either field or on property) to be able to determine the default access type. It is recommended to stick to one single annotation placement strategy throughout your whole application.

However in some situations, you need to:

  • force the access type of the entity hierarchy
  • override the access type of a specific entity in the class hierarchy
  • override the access type of an embeddable type

The best use case is an embeddable class used by several entities that might not use the same access type. In this case it is better to force the access type at the embeddable class level.

(...)

Regarding the pros and cons of both styles, I suggest to read the following questions:

Pascal Thivent
So are you saying that if i put the annotations on the fields, then the get/setters will not be used for anything? What about simple (eg string) fields that don't need annotations, will their fields or setters be used?
Chris
@Chris: If you use field access, *Hibernate* will bypass the get/set pair and access the field directly, using reflection. Regarding the second part of your comment, it all depends on the access type - field or property - that will be guessed *from the position of @Id or @EmbeddedId*.
Pascal Thivent
I've since found that if i use field access, i run into all sorts of problems with the proxies that Hibernate uses for lazy loading. So getters/setters it is! Woo hoo code generation to the rescue! Damn this java stuff is verbose!
Chris
@Chris: I'm personally using property too (see http://stackoverflow.com/questions/594597/hibernate-annotations-which-is-better-field-or-property-access/2869468#2869468).
Pascal Thivent