我现在花了大约两个小时来弄清楚这段代码,例如在下面的类(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 创建类型安全查询很有用。
例如,让我们有以下两个实体,Order
和 Item
:
@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_.id
和Order_.item
的用法。它们静态地访问静态元模型属性(反射(reflect)实体属性),这样确保查询正确构建。
关于java - @StaticMetamodel 和 SingularAttribute<Obj,Obj> 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19704407/