2009-04-30 18 views
7

Todavía no estoy seguro del propósito de las anotaciones en Java. Inicialmente pensé que solo servían como documentación. Pero mirando esta documentación desde Google App Engine Datastore, no estoy tan seguro. @PersistenceCapable (identityType = IdentityType.APPLICATION) se parece más a una firma de método.¿Qué función sirven estas anotaciones de Java?

¿Cuál es el propósito de este tipo de anotación? ¿Qué hace?

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

Respuesta

9

Son metadatos de nivel de origen. Son una forma de agregar información al código que no es código y que se procesa fácilmente en la máquina.

En su ejemplo, se utilizan para configurar el mapeo relacional de objetos para ese tipo de entidad. Se dice que, por ejemplo, el campo id debe ser la clave principal para ese objeto, y que firstName, lastName y hireDate deben almacenarse en la base de datos. (Para distinguir esos campos de algún estado de objeto transitorio)

El soporte de GAE para JDO necesita saber qué objetos intentará almacenar en la base de datos. Hace esto mirando las clases en su código, buscando las que están anotadas con @PersistenceCapable.

Comúnmente, se utilizan para reemplazar el lugar donde utilizaría los archivos de configuración externa anteriormente; la biblioteca estándar de Java tiene herramientas para leer las anotaciones en su código, lo que las hace mucho más fáciles de procesar que rodar su propia fontanería de archivos de configuración, y le ofrece soporte IDE gratis.

+1

Ok, entonces esta clase, entonces es una forma abreviada de definir su modelo. En los viejos tiempos, como dijiste, podrías tener un archivo de configuración en Struts donde usarías notaciones de texto para configurar tu modelo. Pero aquí estamos haciendo lo mismo con las anotaciones. Y asumo que la forma en que funcionan las anotaciones difiere según la biblioteca que esté utilizando y cómo esa biblioteca ha definido las anotaciones para que funcionen. Entonces, @Persistent podría significar una cosa en la biblioteca de JDO pero otra cosa en alguna otra biblioteca. – Bijou

+0

Sí. Por ejemplo, en Hibernate, puede usar archivos .hbm.xml para realizar esta configuración o anotaciones JPA. Es semi-común que una biblioteca use anotaciones especificadas por otra. En este caso, JDO es una especificación de Java que varias bibliotecas admiten/implementan. Por lo tanto, es el almacén de datos de Google App Engine que lee las anotaciones de JDO. Sin embargo, es menos común que tengan un significado diferente. Por supuesto, es completamente posible, y es más fácil hacerlo a través de metadatos (anotaciones) que programáticamente (llamando a algunos métodos). – millimoose

0

Creo que estos provienen de la API Java Data Objects. Es una API que se superpone en cierta medida con lo que se supone que EJB3 debe lograr. Los mismos conceptos, diferentes sintaxis y herramientas.

Si no está familiarizado con las anotaciones en general, comprobar las Java tutorial.

Cuestiones relacionadas