使用 Blaze-Persistence
Blaze-Persistence 在 Jakarta Persistence 之上提供了一个流畅的查询构建器 API,并与 Hibernate ORM 进行了深度集成,它允许使用诸如通用表表达式(Common Table Expressions)之类的 SQL 高级功能,同时保持在 Jakarta Persistence 模型范围内。
此外,Blaze-Persistence Entity-View 模块允许定义 DTO,这些 DTO 可以应用于业务逻辑查询,然后转换为优化的查询,这些查询仅获取构建 DTO 实例所需的数据。相同的 DTO 定义还可以用于应用数据库更新,从而大大减少了样板代码,并消除了对对象映射工具的需求。
此扩展由第三方开发,是 Quarkus Platform 的一部分。 |
设置和配置 Blaze-Persistence
该扩展为 CriteriaBuilderFactory
和 EntityViewManager
提供了默认的生产者,在具有正常工作的 Hibernate ORM 配置的情况下,它们可以开箱即用。对于自定义,可以通过 Quarkus CDI 参考文档中 默认 Bean 中所述的标准机制来覆盖默认生产者。如果您需要设置自定义的 Blaze-Persistence 属性,则需要此操作。
在 Quarkus 中,您只需
-
@Inject
CriteriaBuilderFactory
或EntityViewManager
并使用它 -
使用
@EntityView
和任何其他映射注解像往常一样注解您的实体视图
将以下依赖项添加到您的项目
-
Blaze-Persistence 扩展:
com.blazebit:blaze-persistence-integration-quarkus-3
-
根据需要进一步的 Blaze-Persistence 集成
-
blaze-persistence-integration-jackson-jakarta
用于 Jackson -
blaze-persistence-integration-jsonb-jakarta
用于 JSONB -
blaze-persistence-integration-jaxrs
用于 Jakarta REST -
blaze-persistence-integration-jaxrs-jackson-jakarta
用于 带 Jackson 的 Jakarta REST -
blaze-persistence-integration-jaxrs-jsonb-jakarta
用于 带 JSONB 的 Jakarta REST
-
<!-- Blaze-Persistence specific dependencies -->
<dependency>
<groupId>com.blazebit</groupId>
<artifactId>blaze-persistence-integration-quarkus-3</artifactId>
</dependency>
<dependency>
<groupId>com.blazebit</groupId>
<artifactId>blaze-persistence-integration-hibernate-6.2</artifactId>
<scope>runtime</scope>
</dependency>
implementation("com.blazebit:blaze-persistence-integration-quarkus-3")
runtimeOnly("com.blazebit:blaze-persistence-integration-hibernate-6.2")
在原生镜像中使用需要实体视图注解处理器依赖,该处理器可以提取到单独的 native
profile 中
<profiles>
<profile>
<id>native</id>
<dependencies>
<dependency>
<groupId>com.blazebit</groupId>
<artifactId>blaze-persistence-entity-view-processor-jakarta</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</profile>
</profiles>
将根据 Hibernate-ORM 扩展提供的已配置 EntityManagerFactory
创建 CriteriaBuilderFactory
和 EntityViewManager
。
然后您可以通过注入访问这些 Bean
@ApplicationScoped
public class SantaClausService {
@Inject
EntityManager em; (1)
@Inject
CriteriaBuilderFactory cbf; (2)
@Inject
EntityViewManager evm; (3)
@Transactional (4)
public List<GiftView> findAllGifts() {
CriteriaBuilder<Gift> cb = cbf.create(em, Gift.class);
return evm.applySetting(EntityViewSetting.create(GiftView.class), cb).getResultList();
}
}
1 | 注入 EntityManager |
2 | 注入 CriteriaBuilderFactory |
3 | 注入 EntityViewManager |
4 | 将您的 CDI Bean 方法标记为 @Transactional ,以便启动或加入事务。 |
@Entity
public class Gift {
private Long id;
private String name;
private String description;
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="giftSeq")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
@EntityView(Gift.class)
public interface GiftView {
@IdMapping
Long getId();
String getName();
}
@UpdatableEntityView
@CreatableEntityView
@EntityView(Gift.class)
public interface GiftUpdateView extends GiftView {
void setName(String name);
}
@Path("/gifts")
public class GiftResource {
@Inject
EntityManager entityManager;
@Inject
EntityViewManager entityViewManager;
@Inject
SantaClausService santaClausService;
@POST
@Transactional
public Response createGift(GiftUpdateView view) {
entityViewManager.save(entityManager, view);
return Response.created(URI.create("/gifts/" + view.getId())).build();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<GiftView> getGifts() {
return santaClausService.findAllGifts();
}
@PUT
@Path("{id}")
@Transactional
public GiftView updateGift(@EntityViewId("id") GiftUpdateView view) {
entityViewManager.save(entityManager, view);
return entityViewManager.find(entityManager, GiftView.class, view.getId());
}
@GET
@Path("{id"})
@Produces(MediaType.APPLICATION_JSON)
public GiftView getGift(Long id) {
return return entityViewManager.find(entityManager, GiftView.class, view.getId());
}
}
Blaze-Persistence 配置属性
有各种可选属性可用于优化您的 EntityViewManager
和 CriteriaBuilderFactory
或指导 Quarkus 的推断。
没有必需的属性,只要 Hibernate ORM 扩展配置正确即可。
当未设置任何属性时,将应用 Blaze-Persistence 默认值。
此处列出的配置属性允许您覆盖此类默认值,并自定义和调整各个方面。
构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖
类型 |
默认 |
|
---|---|---|
一个布尔标志,允许在启动时准备所有视图模板缓存。默认情况下,视图模板的预加载是禁用的,以获得更好的启动性能。此属性的有效值为 显示更多 |
布尔值 |
|
一个整数值,定义实体视图属性的默认批处理大小。默认值为 1,可以通过 显示更多 |
整数 |
|
指定是否预期相关值、视图根或嵌入式视图批处理的模式。默认值为 显示更多 |
字符串 |
|
一个布尔标志,允许在启动时准备实体视图更新器缓存。默认情况下,实体视图更新的预加载是禁用的,以获得更好的启动性能。此属性的有效值为 显示更多 |
布尔值 |
|
一个布尔标志,允许禁用严格验证,该验证不允许对非级联属性使用可更新实体视图类型,除非它们与级联属性关联。默认情况下,此操作是被禁止的,即默认值为 显示更多 |
布尔值 |
|
一个布尔标志,允许禁用严格级联检查,该检查不允许在与级联属性关联之前将可更新或可创建的实体视图设置在非级联属性上。禁用此检查后,可能像在 Jakarta Persistence 中一样,对可更新实体视图所做的更改在未与级联更新的属性关联时不会被刷新。默认情况下,此操作是启用的,即默认值为 显示更多 |
布尔值 |
|
一个布尔标志,允许在启用严格级联检查时,将无效集合属性设置器的警告更改为启动时的验证错误。如果设置为 显示更多 |
布尔值 |
|
一个布尔标志,允许指定是否默认创建空扁平视图,如果未通过 显示更多 |
布尔值 |
|
字符串 |
||
如果设置为 true,CTE 查询将默认内联。此属性的有效值为 显示更多 |
布尔值 |
除了这些配置选项之外,还可以通过观察 CriteriaBuilderConfiguration
或 EntityViewConfiguration
事件并在这些对象上应用自定义来进行进一步的配置和定制。各种自定义用例可以在实体视图文档的 Quarkus 部分中找到。
@ApplicationScoped
public class BlazePersistenceConfigurer {
public void configure(@Observes CriteriaBuilderConfiguration config) {
config.setProperty("...", "...");
}
public void configure(@Observes EntityViewConfiguration config) {
// Register custom BasicUserType or register type test values
config.registerBasicUserType(MyClass.class, MyClassBasicUserType.class);
}
}