2013-10-31 5 views
15

Ich versuche, diesen Code für etwa zwei Stunden jetzt herauszufinden, zum Beispiel in der Unterklasse, was diese Felder darstellen?Was ist @StaticMetamodel und SingularAttribute <Obj,Obj>?

import java.util.Date; 
import javax.persistence.metamodel.ListAttribute; 
import javax.persistence.metamodel.SingularAttribute; 
import javax.persistence.metamodel.StaticMetamodel; 
import java.util.UUID; 

@StaticMetamodel(Address.class) 
public class Address_ extends { 
    public static volatile SingularAttribute<Address, Long> id; 
    public static volatile SingularAttribute<Address, UUID> personId; 
    public static volatile SingularAttribute<Address, Person> person; 
} 

Die Address.class ist eine Java-Klasse, die die folgende Definition hat:

@Entity 
@Table(name = "address", schema = "public") 
public class Address{ 
    private Long id; 
    private Person person; 
    private UUID personId; 
    //.... 
} 

Können Sie bitte erklären, was sind die @StaticMetamodel und @SingularAttribute Anmerkungen verwendet? Es könnte einfach sein, aber ich kann es nicht verstehen.

Antwort

17

Per documentation:

Eine statische Metamodell ist eine Reihe von Klassen, den „Spiegel“ die Einheiten und Embeddables im Domänenmodell und bietet statischen Zugriff auf die Metadaten über die Attribute der gespiegelten Klasse.

Die statische Metamodell hat die folgenden Eigenschaften:

  • Für jede verwaltete Klasse X in Paket p, ein Metamodell Klasse X_ in Paket p erstellt wird.
  • Für jede persistente nicht-Sammlung bewertet Attribut y von Klasse deklariert X, wo die Art der yY ist, muss das Metamodell Klasse eine Erklärung enthalten, wie folgt:

SingularAttribute Beispiel:

public static volatile SingularAttribute<X, Y> y; 

Das statische Metamodell ist nützlich zum Erstellen von typsicheren Abfragen mit der Kriterien-API der JPA.

Zum Beispiel, lassen Sie uns die folgenden zwei Entitäten, Order und Item:

@Entity 
public class Order { 
    @Id 
    @GeneratedValue 
    Integer id; 

    @ManyToOne 
    Customer customer; 

    @OneToMany 
    Set<Item> items; 

    BigDecimal totalCost; 

    // accessors 
} 

und die Item Einheit:

@Entity 
public class Item { 
    @Id 
    @GeneratedValue 
    Integer id; 

    int quantity; 

    @ManyToOne 
    Order order; 

    // accessors 
} 

Hier ist eine typsichere Kriterien Abfrage, bauen die Kriterien API:

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Order> cq = cb.createQuery(Order.class); 
SetJoin<Order, Item> itemNode = cq.from(Order.class).join(Order_.items); 
cq.where(cb.equal(itemNode.get(Item_.id), 5)).distinct(true); 

Beachten Sie die Verwendung von Item_.id und Order_.item. Diese Zugriffe statisch die statischen Meta-Modell-Eigenschaften (die die Entity-Eigenschaften spiegeln) und auf diese Weise ist sichergestellt, dass die Abfrage ordnungsgemäß erstellt wird.

+0

danke für Ihre Antwort. Ich kann diesen Teil nicht verstehen, 'statischen Zugriff auf die Metadaten bereitstellen' ich meine, was gewinnen wir hier? Warum sollte man die Entität nicht selbst benutzen? Was kann ich mit Metamodell erreichen, dass ich es nicht anders bekomme? – MoienGK

+0

geht es um Nebenläufigkeit? – MoienGK

+0

Nein, es bedeutet, dass Sie kein Entitätsobjekt instanziieren sollten, um Metadaten für ein Feld zu erhalten. –

Verwandte Themen