26 lipca 2007

Java Persistence - Rozdział 8. Adnotacje metadanych (podstawowe) i jej sekcje 8.1 Entity oraz 8.2 Adnotacje zwrotne

Rozdział 8. Adnotacje metadanych (adnotacje podstawowe, ang. metadata annotations) przedstawia adnotacje opisujące klasy POJO jako klasy encji. Wszystkie adnotacje należą do pakietu javax.persistence.

Adnotacja @Entity definiuje klasę encji i może jedynie wystąpić na poziomie klasy. Adnotacja składa się z pojedyńczego elementu name, który przypisuje nazwę encji do późniejszego odwołania się do niej w zapytaniach JPQL. Domyślna wartość elementu odpowiada niekwalifikowanej (skróconej) nazwie klasy encji.

W poniższym przykładzie element name jest nadmiarowy, ponieważ jej domyślna wartość odpowiada dokładnie podanej wartości.

import javax.persistence.Entity;

@Entity(name = "Osoba")
public class Osoba implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private String imie;

}

Adnotacja @EntityListeners definiuje klasy nasłuchujące zdarzeń rozwojowych encji lub mapowanej nadklasy (ang. mapped superclass), która może dekorować klasę encji bądź mapowaną nadklasę.
Adnotacja @EntityListeners posiada pojedyńczy element o typie Class[].

import javax.persistence.Entity;
import javax.persistence.EntityListeners;

@Entity(name = "Osoba")
@EntityListeners(OsobaListener.class)
public class Osoba implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private long numer;

}

Adnotacja @ExcludeSuperclassListeners wyłącza wykonanie klas nasłuchujących deklarowanych przez nadklasy encji dla udekorowanej encji lub mapowanej nadklasy oraz ich podklas. Innymi słowy wyłącza się wykonanie klas nasłuchujących zdefiniowanych wyżej w hierarchii dziedziczenia dla wszystkich klas poczynając od klasy, w której występuje adnotacja oraz jej potomków. Adnotacja może dekorować klasę i nie posiada elementów.

import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.ExcludeSuperclassListeners;

@Entity
@ExcludeSuperclassListeners
@EntityListeners(PracownikSpecjalnyListener.class)
public class PracownikSpecjalny extends Osoba {

private static final long serialVersionUID = 1L;

}

Adnotacja @ExcludeDefaultListeners wyłącza wykonanie domyślnych klas nasłuchujących dla encji lub mapowanej nadklasy oraz ich potomków. Adnotacja może dekorować klasę i nie posiada elementów.

import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.ExcludeDefaultListeners;
import javax.persistence.ExcludeSuperclassListeners;

@Entity
@ExcludeSuperclassListeners
@EntityListeners(PracownikSpecjalnyListener.class)
@ExcludeDefaultListeners
public class PracownikSpecjalny extends Osoba {

private static final long serialVersionUID = 1L;

}

Adnotacje
  • @PrePersist
  • @PostPersist
  • @PreRemove
  • @PostRemove
  • @PreUpdate
  • @PostUpdate
  • @PostLoad
wskazują metody zwrotne wywoływane dla odpowiednich zdarzeń rozwojowych związanych z encją. Adnotacje mogą dekorować metody klasy encji, mapowanej nadklasy lub klasy nasłuchującej encji.

import javax.persistence.Entity;
import javax.persistence.EntityListeners;

@Entity(name = "Osoba")
@EntityListeners(OsobaListener.class)
public class Osoba implements Serializable {

private static final long serialVersionUID = 1L;

@Id
private long numer;

@PostPersist
protected void nowaOsobaUtworzona() {
logger.info("Utworzono osobę o identyfikatorze " + numer);
}

}

lub dla klasy nasłuchującej:

package pl.jaceklaskowski.jpa.entity.listeners;

import java.util.logging.Logger;

import javax.persistence.PostPersist;

import pl.jaceklaskowski.jpa.entity.Osoba;

public class OsobaListener {

private static final Logger logger = Logger.getLogger(OsobaListener.class.getName());

@PostPersist
protected void nowaOsobaUtworzona(Osoba osoba) {
logger.info("Utworzono osobę o identyfikatorze " + osoba.getNumer());
}
}