2010-07-20 12 views
18

Wo setze ich meine Winterschlafnotizen ein?Wo können Hibernate-Annotationen platziert werden?

Ist es die Zeile über meiner Instanzvariable? Oder vor dem Getter? Oder vor dem Setzer? Oder ist es nicht wirklich wichtig?

Vielen Dank

+1

Ich habe festgestellt, dass, wenn ich Feldzugriff verwenden, ich alle möglichen Probleme mit den Proxies, die Hibernate für Lazy Loading verwendet. Also Getter/Setter ist es! Woo hoo Code Generation zur Rettung! Verdammt, dieses Java-Zeug ist ausführlich! – Chris

+0

^In der Tat, ich habe mit Lazy Loading Probleme für eine Weile gekämpft (setzen Sie meine Modelle zu eifrig holen, nur um es zu arbeiten, während es nur ein Prototyp ist!), Aber ja, Getter/Setter sind sehr wichtig für den Winterschlaf. – fabspro

+0

Mein Buch - Hibernate leicht gemacht sagt mir, es vor den Gettern und Setter zu stellen. Ich weiß nicht warum. –

Antwort

21

Sie platzieren sie entweder auf dem Feld oder auf dem Getter. Aus dem Hibernate Annotations-Referenzhandbuch:

2.2.1. Marking a POJO as persistent entity

(...)

Je nachdem, ob Sie mit Anmerkungen versehen Felder oder Methoden, der Zugriffstyp von Hibernate verwendet wird Feld oder Eigenschaft sein . Die EJB3-Spezifikation erfordert Sie deklarieren Anmerkungen für das Element Typ, auf den zugegriffen wird, d. H. Die Getter-Methode, wenn Sie die Eigenschaft Zugriff verwenden, das Feld, wenn Sie Feld Zugriff verwenden. Das Mischen von Annotationen in Feldern und Methoden von sollte vermieden werden. Hibernate erraten den Zugriffstyp von der Position @Id oder @EmbeddedId.

Sie könnten auch über die @Access Anmerkung lesen möchten, die/den Zugriffstyp (vor Hibernate Annotations 3.5 und JPA 2.0, es war Teil von Hibernate Annotation Extensions) außer Kraft zu erzwingen erlaubt:

2.2.2.2. Access type

der Zugriffstyp einer Klasse Hierarchie Standardmäßig wird durch die Position des @Id oder @EmbeddedId Anmerkungen definiert. Wenn sich diese Anmerkungen in einem Feld befinden, werden nur Felder für Persistence berücksichtigt und der Status wird über das Feld abgerufen. Wenn sich die Anmerkungen auf einem Getter befinden, werden nur die Getter für die Persistenz berücksichtigt und der -Status wird über den Getter/Setter aufgerufen. Das funktioniert gut in Praxis und ist die empfohlene Ansatz.

Hinweis

Die Platzierung von Anmerkungen innerhalb einer Klassenhierarchie hat konsistente (entweder Feld oder auf Eigentum) seine Lage zu bestimmen, den Standard-Zugänge Typen zu sein.Es wird empfohlen, eine einzelne Annotation Platzierung Strategie in Ihrer gesamten Anwendung zu halten.

jedoch in einigen Situationen müssen Sie zu:

  • Kraft der Zugriffstyp des Entitätshierarchie
  • Überschreibung der Zugriffstyp einer bestimmten Einheit in der Klassenhierarchie
  • Überschreibung der Zugangstyp eines einbettbaren Typs

Der beste Anwendungsfall ist ein einbettbarer Klasse von mehreren Entitäten verwendet, die möglicherweise nicht den gleichen Zugriffstyp verwenden. In diesem Fall ist es besser, den Zugriffstyp auf der Ebene der einbettbaren Klasse zu erzwingen.

(...)

In Bezug auf die Vor- und Nachteile der beiden Arten, schlage ich vor, die folgenden Fragen zu lesen:

+0

Also sagst du, wenn ich die Anmerkungen auf die Felder setze, dann werden die get/setters für nichts verwendet?Was ist mit einfachen (zB String-) Feldern, die keine Anmerkungen benötigen, werden ihre Felder oder Setter verwendet? – Chris

+0

@Chris: Wenn Sie Feldzugriff verwenden, wird * Hibernate * das get/set-Paar umgehen und das Feld direkt über Reflexion aufrufen. Für den zweiten Teil Ihres Kommentars hängt alles vom Zugriffstyp - Feld oder Eigenschaft - ab, der von der Position von @Id oder @ EmbeddedId * erraten wird. –

+1

Ich habe festgestellt, dass, wenn ich Feldzugriff verwenden, ich alle möglichen Probleme mit den Proxies, die Hibernate für Lazy Loading verwendet. Also Getter/Setter ist es! Woo hoo Code Generation zur Rettung! Verdammt, dieses Java-Zeug ist ausführlich! – Chris

2

Es liegt an Ihrem Stil. Sie können es vor dem Feld oder vor Getter setzen. In der strengen JPA werden die Anmerkungen zu den Setter ignoriert, aber ich bin mir nicht sicher, ob Hibernate dem folgt.

Sie müssen entweder konsistent in Ihrer Entität sein, oder Sie müssen eine @ Access-Annotation am Anfang der Klasse mit einem Standardmodus und eine weitere @ Access vor jedem Feld/Eigenschaft, die Sie von der aktuellen abweichen möchten Klassenmodus.

1

Hibernate ist dafür bekannt, Java-Reflektion zu verwenden. Es spielt also keine Rolle, ob Sie es über das Feld oder über den Getter legen.

1

Hier finden Sie eine Beschreibung wichtiger Annotationen in Hibernate.

@Entity: declares the class as an entity (i.e. a persistent POJO class) 

@Table: is set at the class level; it allows you to define the table, catalog, and schema names for your entity mapping. If no @Table is defined the default values are used: the unqualified class name of the entity. 

@Id: declares the identifier property of this entity. 

@Generated Value: annotation is used to specify the primary key generation strategy to use. If the strategy is not specified by default AUTO will be used. 

@Column: annotation is used to specify the details of the column to which a field or property will be mapped. If the @Column annotation is not specified by default the property name will be used as the column name. 

Annotationen basierte Vererbung Mapping in Hibernate: Es gibt drei Arten os Vererbungs Mappings in Hibernate. Sie sind

1.Table pro Klassenhierarchie:

@Inheritance – Defines the inheritance strategy to be used for an entity class hierarchy. It is specified on the entity class that is the root of the entity class hierarchy. 

@DiscriminatorColumn – Is used to define the discriminator column for the SINGLE_TABLE inheritance mapping strategies. The strategy and the discriminator column are only specified in the root of an entity class hierarchy or sub hierarchy in which a different inheritance strategy is applied 

If the @DiscriminatorColumn annotation is missing, and a discriminator column is required, the name of the discriminator column defaults to "DTYPE" and the discriminator type to DiscriminatorType.STRING. 

@DiscriminatorValue – Is used to specify the value of the discriminator column for entities of the given type. The DiscriminatorValue annotation can only be specified on a concrete entity class. If the DiscriminatorValue annotation is not specified and a discriminator column is used, a provider-specific function will be used to generate a value representing the entity type. If the DiscriminatorType is STRING, the discriminator value default is the entity name. 

2.Table pro Unterklassenhierarchie:

@InheritanceType – Defines inheritance strategy options. JOINED is a strategy in which fields that are specific to a subclass are mapped to a separate table than the fields that are common to the parent class, and a join is performed to instantiate the subclass. 

@PrimaryKeyJoinColumn – This annotation specifies a primary key column that is used as a foreign key to join to another table. 

3.Table pro Betonklassenhierarchie:

@InheritanceType – Defines inheritance strategy options. TABLE_PER_CLASS is a strategy to map table per concrete class. 
@AttributeOverrides – This annotation is used to override mappings of multiple properties or fields. 

@AttributeOverride – The AttributeOverride annotation is used to override the mapping of a Basic (whether explicit or default) property or field or Id property or field. 

Ich hoffe, es hilft, eine Idee über grundlegende Annotation in Hibenate zu bekommen.

Verwandte Themen