java - @StaticMetamodel 和 SingularAttribute<Obj,Obj> 是什么?

标签 java spring hibernate jpa dependency-injection

我现在花了大约两个小时来弄清楚这段代码,例如在下面的类(class)中,这些字段代表什么?

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是一个java类,定义如下:

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

您能解释一下 @StaticMetamodel@SingularAttribute 注释的用途吗?可能很简单,但我看不懂。

最佳答案

根据 documentation :

A static metamodel is a series of classes that "mirror" the entities and embeddables in the domain model and provide static access to the metadata about the mirrored class's attributes.

静态元模型具有以下属性:

  • 对于包p 中的每个托管类X,都会创建包p 中的元模型类X_
  • 对于 X 类声明的每个持久非集合值属性 y,其中 y 的类型为 Y,元模型类必须包含如下声明:

SingularAttribute 例子:

public static volatile SingularAttribute<X, Y> y;

静态元模型对于使用 JPA 的 Criteria API 创建类型安全查询很有用。

例如,让我们有以下两个实体,OrderItem:

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

    @ManyToOne 
    Customer customer;

    @OneToMany 
    Set<Item> items;

    BigDecimal totalCost;

    // accessors
}

Item实体:

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

    int quantity;

    @ManyToOne
    Order order;

    // accessors
}

这是一个类型安全的条件查询,使用 Criteria 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);

注意Item_.idOrder_.item 的用法。它们静态地访问静态元模型属性(反射(reflect)实体属性),这样确保查询正确构建。

关于java - @StaticMetamodel 和 SingularAttribute<Obj,Obj> 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19704407/

相关文章:

java - 内存泄漏 Spring Boot

java - 如何在 Java 中获取 GPS 时间和 TAI 时间?

java - 如何在 Play-With-Docker-Lab 中指定 java 的文件夹路径?

java - spring不使用RequestMappingHandlerMapping来映射请求

java.lang.NoSuchMethodException : userAuth. User.<init>()

java - 如何将 Class< 类型的值存储到数据库?使用 Hibernate 扩展 View>

java - 构建两个build.gradle文件,第二个build.gradle的文件路径错误

java - 等待客户端答复时 GUI 卡住

java - 无法推断基本网址。这在使用动态 servlet 注册或 API 位于 API 网关 swagger 2.10.5 之后时很常见

java - 使用 hibernate 进行类转换异常