2013-10-31 32 views
15

Bu kodu yaklaşık iki saat boyunca anlamaya çalışıyorum, örneğin aşağıdaki sınıflar bu alanları temsil ediyor mu?@StaticMetamodel ve SingularAttribute <Obj,Obj> nedir?

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

Address.class olan şu tanıma sahip bir java sınıfı:

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

Eğer, kullanılan @StaticMetamodel ve @SingularAttribute açıklamalar nelerdir açıklayabilir misiniz? Basit olabilir ama anlayamıyorum. documentation gereğince

cevap

17

:

Statik metamodel "ayna" alan modelinde kişiler ve embeddables ve aynalı sınıfının öznitelikler hakkında meta verilere statik erişim sağlamak olduğunu sınıfların dizisidir. paketin p her yönetilen sınıfın X için

  • , paketin p bir metamodel sınıfı X_ oluşturulur:

statik metamodel aşağıdaki özelliklere sahiptir. aşağıdaki gibi y tipi Y olan sınıf X, tarafından açıklanan her kalıcı olmayan toplama değerli öznitelik y için

  • , metamodel sınıfı, bir bildiri içermelidir:

    SingularAttribute örnek:

    public static volatile SingularAttribute<X, Y> y; 
    

    Statik metamodel, JPA'nın Kriterler API'sı ile tür güvenli sorguları oluşturmak için yararlıdır. Kriterler API ile inşa Burada

    @Entity 
    public class Item { 
        @Id 
        @GeneratedValue 
        Integer id; 
    
        int quantity; 
    
        @ManyToOne 
        Order order; 
    
        // accessors 
    } 
    

    türgüvenli kriterleri sorgu var:

    @Entity 
    public class Order { 
        @Id 
        @GeneratedValue 
        Integer id; 
    
        @ManyToOne 
        Customer customer; 
    
        @OneToMany 
        Set<Item> items; 
    
        BigDecimal totalCost; 
    
        // accessors 
    } 
    

    ve Item varlık: Örneğin

    , en alttaki iki tarafını, Order ve Item atalım

    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); 
    

    Item_.id ve Order_.item. erişim kurallarına göre statik olarak statik meta model özellikleri (varlık özelliklerini yansıtan) ve bu şekilde sorgusunun doğru şekilde oluşturulduğundan emin olun.

    +0

    Cevabınız için teşekkür ederiz. Bu kısmı anlayamıyorum 'meta verilere statik erişim sağlayın' demek istediğim, burada ne kazanıyoruz? Neden varlığın kendisi kullanılmamalıdır? Metamodel kullanarak başka bir şey elde edemem ne yapabilirim? – MoienGK

    +0

    eşzamanlılık ile ilgili mi? – MoienGK

    +0

    Hayır, bir alan için meta veriler elde etmek amacıyla bir varlık nesnesini başlatmanızın gerekmediği anlamına gelir. –