Moi*_*nGK 20 java spring hibernate dependency-injection jpa
我现在试图找出这个代码大约两个小时,例如在下面的类中这些字段代表什么?
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;
}
Run Code Online (Sandbox Code Playgroud)
这Address.class是一个java类,它具有以下定义:
@Entity
@Table(name = "address", schema = "public")
public class Address{
private Long id;
private Person person;
private UUID personId;
//....
}
Run Code Online (Sandbox Code Playgroud)
请问您能解释一下使用的注释@StaticMetamodel和@SingularAttribute注释吗?这可能很简单,但我无法理解.
Kon*_*kov 20
根据文件:
静态元模型是一系列类,"镜子"的实体和embeddables在领域模型中,并提供至约镜像类的属性元数据的静态的访问.
静态元模型具有以下属性:
X中包p,一个元模型类X_中包p被创建.y由类声明的每个持久性非集合值属性X,其类型为yis Y,元模型类必须包含如下声明:SingularAttribute 例:
public static volatile SingularAttribute<X, Y> y;
Run Code Online (Sandbox Code Playgroud)
静态元模型对于使用JPA的Criteria API 创建类型安全查询很有用.
例如,让我们有以下两个实体,Order并且Item:
@Entity
public class Order {
@Id
@GeneratedValue
Integer id;
@ManyToOne
Customer customer;
@OneToMany
Set<Item> items;
BigDecimal totalCost;
// accessors
}
Run Code Online (Sandbox Code Playgroud)
和Item实体:
@Entity
public class Item {
@Id
@GeneratedValue
Integer id;
int quantity;
@ManyToOne
Order order;
// accessors
}
Run Code Online (Sandbox Code Playgroud)
这是一个使用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);
Run Code Online (Sandbox Code Playgroud)
注的用法Item_.id和Order_.item.那些静态访问静态元模型属性(镜像实体属性),这样就可以确保查询正确构建.
小智 6
最近,当我一直在尝试学习和理解 JPA 时,我一直在思考这个问题。我相信我已经回答了您的问题:为什么我们需要元模型,为什么我们不能只使用实体模型?
看看这个实体:
@Entity
public class Item {
@Id
@GeneratedValue
Integer id;
int quantity;
@ManyToOne
Order order;
// accessors
}
Run Code Online (Sandbox Code Playgroud)
请注意,实体上的所有属性都没有关键字 static。这意味着为了使用它们,我们需要创建一个新对象。
当我们使用 CriteriaBuilder 构建查询时,我们不需要创建对象......我们只想使用实体上的属性来生成查询。这就是我们拥有元模型的原因!它们创建我们可以访问的静态属性,而无需创建对象。所以我们可以做康斯坦丁提到的事情:
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);
Run Code Online (Sandbox Code Playgroud)
在这里,我们不是在创建一个“Item”对象......我们只需要知道它的属性。MetaModel 上的静态属性使我们能够做到这一点!
| 归档时间: |
|
| 查看次数: |
16352 次 |
| 最近记录: |