2009-04-30 3 views
7

Я все еще не понимаю цели аннотации в Java. Первоначально я думал, что они просто служили документацией. Но, глядя на эту документацию от Google App Engine Datastore, я не уверен. @PersistenceCapable (identityType = IdentityType.APPLICATION) больше похож на подпись метода.Какую функцию выполняют эти аннотации Java?

Какова цель этого аннотации? Что оно делает?

import java.util.Date; 
import javax.jdo.annotations.IdGeneratorStrategy; 
import javax.jdo.annotations.IdentityType; 
import javax.jdo.annotations.PersistenceCapable; 
import javax.jdo.annotations.Persistent; 
import javax.jdo.annotations.PrimaryKey; 

@PersistenceCapable(identityType = IdentityType.APPLICATION) 
public class Employee { 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Long id; 

    @Persistent 
    private String firstName; 

    @Persistent 
    private String lastName; 

    @Persistent 
    private Date hireDate; 

    public Employee(String firstName, String lastName, Date hireDate) { 
     this.firstName = firstName; 
     this.lastName = lastName; 
     this.hireDate = hireDate; 
    } 

    // Accessors for the fields. JDO doesn't use these, but your application does. 

    public Long getId() { 
     return id; 
    } 

    public String getFirstName() { 
     return firstName; 
    } 

    // ... other accessors... 
} 

ответ

9

Это метаданные исходного уровня. Это способ добавления информации к коду, который не является кодом, и который легко обрабатывается машиной.

В вашем примере они используются для настройки объектно-реляционного сопоставления для этого типа сущности. Это говорит о том, что, например, поле id должно быть основным ключом для этого объекта, и что firstName, lastName и hireDate должны храниться в базе данных. (Чтобы указать эти поля отдельно от состояния переходного объекта.)

Поддержка GAE для JDO должна знать, какие объекты вы попытаетесь сохранить в базе данных. Он делает это, просматривая классы в вашем коде, ища те, которые аннотируются с помощью @PersistenceCapable.

Обычно они используются для замены того, где вы использовали внешние файлы конфигурации; стандартная библиотека Java имеет инструменты для чтения аннотаций в вашем коде, что значительно упрощает их обработку, чем развертывание собственной настройки файла конфигурации, и вы получаете бесплатную поддержку IDE.

+1

Итак, этот класс, а значит, является сокращенным способом определения вашей модели. В старые времена, как вы сказали, у вас может быть файл конфигурации в Struts, где вы должны использовать текстовые обозначения для настройки вашей модели. Но здесь мы делаем то же самое с аннотациями. И я предполагаю, что работа аннотаций отличается в зависимости от используемой библиотеки и того, как эта библиотека определила аннотации для работы. Таким образом, @Persistent может означать одно в библиотеке JDO, но еще одна вещь в другой библиотеке. – Bijou

+0

Да. Например, в Hibernate вы можете использовать файлы .hbm.xml для этой конфигурации или аннотации JPA. Это слишком распространено для библиотеки, чтобы использовать аннотации, указанные другим. В этом случае JDO является спецификацией Java, поддерживаемой/реализуемой несколькими библиотеками. Таким образом, это хранилище данных Google App Engine, читающее аннотации JDO. Менее распространено то, что они имели бы другое значение. Это, конечно, вполне возможно, и сделать это легче с помощью метаданных (аннотаций), чем программно (вызывая некоторые методы). – millimoose

0

Я думаю, что они исходят из API Java Data Objects. Это API, который частично совпадает с тем, что должен выполнить EJB3. Те же концепции, различный синтаксис и инструменты.

Если вы не знакомы с аннотациями вообще, проверьте Java tutorial.