2013-10-31 28 views
15

Tôi đang cố gắng tìm ra mã này trong khoảng hai giờ ngay bây giờ, ví dụ trong lớp dưới đây các trường này đại diện cho những gì?@StaticMetamodel và SingularAttribute <Obj,Obj> là gì?

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

Các Address.class là một lớp java trong đó có các định nghĩa sau đây:

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

Bạn có thể, xin vui lòng, giải thích @StaticMetamodel@SingularAttribute chú thích dùng để là gì? Nó có thể đơn giản nhưng tôi không thể hiểu được.

Trả lời

17

Theo documentation:

Một metamodel tĩnh là một loạt các lớp rằng "gương" các đối tượng và embeddables trong mô hình miền và cung cấp truy cập tĩnh đến siêu dữ liệu về các thuộc tính lớp gương của.

Các metamodel tĩnh có các thuộc tính sau:

  • Đối với mỗi lớp quản lý X trong gói p, một lớp metamodel X_ trong gói p được tạo ra.
  • Đối với mỗi không thu có giá trị thuộc tính dai dẳng y tuyên bố bởi lớp X, nơi mà các loại yY, lớp metamodel phải chứa một tuyên bố như sau:

SingularAttribute dụ:

public static volatile SingularAttribute<X, Y> y; 

Metamodel tĩnh hữu ích khi tạo các truy vấn an toàn loại loại an toàn với API tiêu chí của JPA.

Ví dụ, chúng ta hãy có hai đối tượng sau đây, OrderItem:

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

    @ManyToOne 
    Customer customer; 

    @OneToMany 
    Set<Item> items; 

    BigDecimal totalCost; 

    // accessors 
} 

Item thực thể:

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

    int quantity; 

    @ManyToOne 
    Order order; 

    // accessors 
} 

Dưới đây là một truy vấn tiêu chí typesafe, xây dựng với API Tiêu chí:

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

Lưu ý việc sử dụng của Item_.idOrder_.item. Các truy cập đó tĩnh các thuộc tính mô hình meta tĩnh (phản ánh thuộc tính đối tượng) và theo cách này, nó được đảm bảo đảm bảo truy vấn được xây dựng đúng cách.

+0

cảm ơn câu trả lời của bạn. tôi không thể hiểu được phần này 'cung cấp truy cập tĩnh cho siêu dữ liệu' tôi có nghĩa là chúng ta đạt được điều gì ở đây? tại sao người ta không nên sử dụng thực thể? những gì tôi có thể đạt được bằng cách sử dụng metamodel mà tôi không thể có được nó oround cách khác? – MoienGK

+0

là về đồng thời? – MoienGK

+0

Không, điều đó có nghĩa là bạn không được phép khởi tạo một đối tượng thực thể để nhận siêu dữ liệu cho một trường. –

Các vấn đề liên quan