编辑此页面

使用 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

该扩展为 CriteriaBuilderFactoryEntityViewManager 提供了默认的生产者,在具有正常工作的 Hibernate ORM 配置的情况下,它们可以开箱即用。对于自定义,可以通过 Quarkus CDI 参考文档中 默认 Bean 中所述的标准机制来覆盖默认生产者。如果您需要设置自定义的 Blaze-Persistence 属性,则需要此操作。

在 Quarkus 中,您只需

  • @Inject CriteriaBuilderFactoryEntityViewManager 并使用它

  • 使用 @EntityView 和任何其他映射注解像往常一样注解您的实体视图

将以下依赖项添加到您的项目

  • Blaze-Persistence 扩展:com.blazebit:blaze-persistence-integration-quarkus-3

  • 根据需要进一步的 Blaze-Persistence 集成

使用 Maven 的示例依赖
<!-- 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>
使用 Gradle
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 创建 CriteriaBuilderFactoryEntityViewManager

然后您可以通过注入访问这些 Bean

使用 Hibernate 的示例应用程序 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);
}
示例 Jakarta REST 资源
@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 配置属性

有各种可选属性可用于优化您的 EntityViewManagerCriteriaBuilderFactory 或指导 Quarkus 的推断。

没有必需的属性,只要 Hibernate ORM 扩展配置正确即可。

当未设置任何属性时,将应用 Blaze-Persistence 默认值。

此处列出的配置属性允许您覆盖此类默认值,并自定义和调整各个方面。

构建时固定的配置属性 - 所有其他配置属性都可以在运行时覆盖

配置属性

类型

默认

一个布尔标志,允许在启动时准备所有视图模板缓存。默认情况下,视图模板的预加载是禁用的,以获得更好的启动性能。此属性的有效值为 truefalse

显示更多

布尔值

一个整数值,定义实体视图属性的默认批处理大小。默认值为 1,可以通过 com.blazebit.persistence.view.BatchFetch#size() 或通过设置此属性(使用 com.blazebit.persistence.view.EntityViewSetting#setProperty)来覆盖。

显示更多

整数

指定是否预期相关值、视图根或嵌入式视图批处理的模式。默认值为 values,可以通过设置此属性(使用 com.blazebit.persistence.view.EntityViewSetting#setProperty)来覆盖。有效值为:valuesview_rootsembedding_views

显示更多

字符串

一个布尔标志,允许在启动时准备实体视图更新器缓存。默认情况下,实体视图更新的预加载是禁用的,以获得更好的启动性能。此属性的有效值为 truefalse

显示更多

布尔值

一个布尔标志,允许禁用严格验证,该验证不允许对非级联属性使用可更新实体视图类型,除非它们与级联属性关联。默认情况下,此操作是被禁止的,即默认值为 true,但由于可能存在一些奇怪的模型,因此可以允许此操作。此属性的有效值为 truefalse

显示更多

布尔值

一个布尔标志,允许禁用严格级联检查,该检查不允许在与级联属性关联之前将可更新或可创建的实体视图设置在非级联属性上。禁用此检查后,可能像在 Jakarta Persistence 中一样,对可更新实体视图所做的更改在未与级联更新的属性关联时不会被刷新。默认情况下,此操作是启用的,即默认值为 true。此属性的有效值为 truefalse

显示更多

布尔值

一个布尔标志,允许在启用严格级联检查时,将无效集合属性设置器的警告更改为启动时的验证错误。如果设置为 true,则在遇到无效设置器时会抛出启动时的验证错误,否则只会发出警告。此配置在禁用严格级联检查时无效。默认情况下,此操作是禁用的,即默认值为 false。此属性的有效值为 truefalse

显示更多

布尔值

一个布尔标志,允许指定是否默认创建空扁平视图,如果未通过 EmptyFlatViewCreation 指定。默认情况下,空扁平视图的创建是启用的,即默认值为 true。此属性的有效值为 truefalse

显示更多

布尔值

表达式缓存实现的完全限定类名。

显示更多

字符串

如果设置为 true,CTE 查询将默认内联。此属性的有效值为 truefalseauto。默认值为 true,它将始终内联非递归 CTE。auto 配置将仅在 Jakarta Persistence 提供商和 DBMS 方言支持/需要时使用内联。可以在创建查询之前更改此属性的值。

显示更多

布尔值

除了这些配置选项之外,还可以通过观察 CriteriaBuilderConfigurationEntityViewConfiguration 事件并在这些对象上应用自定义来进行进一步的配置和定制。各种自定义用例可以在实体视图文档的 Quarkus 部分中找到。

示例 CriteriaBuilderConfiguration 和 EntityViewConfiguration 观察
@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);
    }
}

限制

Apache Derby

Blaze-Persistence 目前不支持 Apache Derby。如果未来有令人信服的需求并且有人贡献,这个限制可能会被解除。