Где разместить спящие аннотации? - PullRequest
19 голосов
/ 20 июля 2010

Где я могу разместить свои спящие аннотации?

Это строка над моей переменной экземпляра? Или перед добытчиком? Или перед сеттером? Или это не имеет значения?

Большое спасибо

Ответы [ 4 ]

22 голосов
/ 20 июля 2010

Вы помещаете их либо в поле , либо в геттер . Из Справочного руководства по Hibernate:

2.2.1. Пометка POJO как постоянного объекта

(...)

В зависимости от того, аннотируете ли вы поля или методы, тип доступа используется Hibernate будет поле или имущество. Спецификация EJB3 требует, чтобы вы объявляете аннотации на элемент тип, к которому будет осуществляться доступ, т.е. метод получения, если вы используете свойство доступ, поле, если вы используете поле доступ. Смешивание аннотаций в обоих полей и методов следует избегать. Hibernate будет угадывать тип доступа с позиции @Id или @ EmbeddedId.

Вы также можете прочитать аннотацию @Access, которая позволяет принудительно / переопределять тип доступа (до аннотаций Hibernate 3.5 и JPA 2.0 он был частью расширений аннотаций Hibernate):

2.2.2.2. Тип доступа

По умолчанию тип доступа класса иерархия определяется положением аннотаций @Id или @EmbeddedId. Если эти аннотации на поле, тогда только поля рассматриваются для настойчивость и состояние доступно через поле. Если есть аннотации на добытчик, то только добытчики считаются для настойчивости и состояние доступно через геттер / сеттер. Это хорошо работает в практика и рекомендуется подход.

Примечание

Размещение аннотаций в иерархии классов должно быть согласованным (либо поле, либо свойство) возможность определить доступ по умолчанию тип. Рекомендуется придерживаться одно размещение аннотации стратегия на протяжении всего вашего применение.

Однако в некоторых ситуациях вам нужно чтобы:

  • принудительный тип доступа к иерархии объектов
  • переопределить тип доступа конкретной сущности в иерархии классов
  • переопределить тип доступа встраиваемого типа

Лучший вариант использования - встраиваемый класс, используемый несколькими объектами, которые может не использовать тот же тип доступа. В в этом случае лучше форсировать тип доступа в встраиваемом классе уровень.

(...)

Относительно плюсов и минусов обоих стилей, предлагаю прочитать следующие вопросы:

2 голосов
/ 20 июля 2010

Это зависит от вашего стиля. Вы можете поставить его перед полем или перед добытчиком. В строгом JPA комментарии к сеттерам игнорируются, но я не уверен, что Hibernate следует этому.

Вам либо нужно быть согласованным во всем вашем Entity, либо вам нужно предоставить аннотацию @Access в верхней части класса с режимом по умолчанию и еще один @Access перед каждым полем / свойством, которое вы хотите отклонить от текущего класса режим.

1 голос
/ 23 декабря 2013

Вот описание некоторых важных аннотаций, используемых в 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.

Отображение на основе аннотаций в Hibernate: Существует три вида отображений наследования в спящем режиме. Они

1. Таблица для иерархии классов:

@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. Таблица для иерархии подклассов:

@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. Таблица для конкретной иерархии классов:

@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.

Надеюсь, это поможет понять основную аннотацию, используемую в hibenate.

1 голос
/ 25 августа 2011

Hibernate, как известно, использует отражение Java. Так что на самом деле не имеет значения, положите ли вы его над полем или над геттером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...