Hibernate OGM 已不再维护

我很高兴宣布 Hibernate OGM 4.1.3 最终版和 4.2.0.Beta1 的发布!

前者带来了几个可用性改进、错误修复和组件升级,而后者则带来了新的查询功能、非事务性数据存储的错误处理 API 以及更多。

您可以从 SourceForge(4.1.3.Final4.2.0.Beta1)以 ZIP 或 TAR.GZ 格式获取这些版本,或者通过 Maven、Gradle 等,使用以下 GAV 坐标:

  • org.hibernate.ogm:hibernate-ogm-core:4.1.3.Finalorg.hibernate.ogm:hibernate-ogm-core:4.2.0.Beta1 用于 Hibernate OGM 引擎,以及
  • org.hibernate.ogm:hibernate-ogm-<%DATASTORE%>:4.1.3.Finalorg.hibernate.ogm:hibernate-ogm-<%DATASTORE%>:4.2.0.Beta1,具体取决于您要使用的后端。

请注意,从 4.2 版本开始,Hibernate OGM 需要 Java 7。我们尽可能长时间地保持了 Java 6 兼容性,但随着我们越来越多的后端和组件需要 Java 7(例如 Neo4j 和 Lucene),我们认为现在是时候继续前进,并利用 Java 7 的优点来改进 Hibernate OGM 代码库。

让我们深入了解 4.2 Beta1 版本的一些新功能。

查询改进

我们继续追求广泛的查询能力,并启用了更多 JP-QL 构造,特别是对元素集合的查询。例如,考虑以下实体Order它包含一个订单行的元素集合

@Entity
public class Order {

    @Id
    @GeneratedValue
    private long id;

    @ElementCollection
    private List<OrderLine> orderLines = new ArrayList<>();

    // getter, setters etc. ...
}

@Embeddable
public class OrderLine {

    private String item;
    private BigDecimal price;

    // getter, setters etc. ...
}

要获取包含木质玩具火车的订单行的所有订单的列表,您可以运行以下 JP-QL 查询

List<Order> toyTrainOrders = entityManager
    .createQuery( "FROM Order o JOIN o.orderLines ol WHERE ol.item LIKE '%wooden toy train%'" )
    .getResultList();

与其他 JP-QL 查询一样,Hibernate OGM 将查询字符串转换为 MongoDB 和 Neo4j 的本地查询。对于其他后端,将创建基于 Lucene 的全文查询。

请注意,当前仅支持元素集合的 JOIN 语法,即您不能为其他实体创建任意关联的 join 查询。原因在于大多数 NoSQL 存储不支持不同表/集合之间的 join,因此此类查询无法合理地转换。例外是像 Neo4j 这样的图数据库,其中 join 可以转换为基于关系的查询(对于元素集合的情况实际上就是这样发生的),但我们尚未达到那个水平 :)

用于检索所有已执行和失败的存储操作 API

Hibernate ORM 会内部收集所有写操作,并在大多数情况下仅在事务提交时将它们传播到数据库(此外,在查询执行之前或显式调用flush()时,也会刷新更改)。这使许多优化成为可能,例如批量插入。Hibernate OGM 采用这种方法,并使用事务边界来划分工作单元并触发对数据存储的写入。

虽然这自然与事务性 NoSQL 存储如 Infinispan 或 Neo4j 工作得很好,但在非事务性数据存储上会带来一些挑战。因此,4.2 版本提供了 API 的初始草案,它在数据存储操作失败时通知您,让您采取适当的行动,例如记录所有之前应用的操作或重试失败的操作。

为了不让这个发布通知变得太大,有一个单独的文章专门介绍这个新的 API。

Fongo 支持

Fongo ("仿制 Mongo") 是测试 MongoDB 应用程序的一个非常好的工具。它提供了一种纯内存实现的 MongoDB Java API,允许在不启动实际 MongoDB 实例的情况下测试基于 MongoDB 的应用程序。

多亏了社区成员 Alex Soto,您现在也可以使用 Fongo 来测试基于 Hibernate OGM 的应用程序。为此,只需将以下依赖项添加到您的项目中(假设您使用 Maven 并已将 Hibernate OGM BOM 添加到 POM 文件的dependencyManagement 块中)

<dependencies>
    <dependency>
        <groupId>org.hibernate.ogm</groupId>
        <artifactId>hibernate-ogm-mongodb</artifactId>
    </dependency>
    <dependency>
        <groupId>com.github.fakemongo</groupId>
        <artifactId>fongo</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

然后指定 "fongodb" 作为 Hibernate OGM 数据存储提供者,例如通过在 META-INF/persistence.xml 中的持久单元属性中指定

<persistence-unit name="example-PU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ogm.jpa.HibernateOgmPersistence</provider>
    <properties>
        <property name="hibernate.ogm.datastore.provider" value="fongodb"/>
    </properties>
</persistence-unit>

Hibernate OGM 将现在使用 Fongo 而不是真实 MongoDB 服务器作为后端。正如所说,这在测试您的应用程序时非常方便,但不要忘记在部署到生产环境时切换到真实的数据存储 ;-)

可用性改进

最后,让我们快速看一下两个很好的可用性改进,这些改进您已经在 4.1.3 的更新中获得了。

第一个是对于与 MongoDB 等存储一起使用 Java SE 的RESOURCE_LOCAL事务类型提供了更好的支持。如上所述,Hibernate OGM 依赖于事务划分来收集数据更改并以优化的方式将它们写入数据存储。这曾经需要一个类路径上的 JTA 实现,即使底层数据存储实际上不是事务性的。现在不再需要了,即您可以无需任何其他依赖项即可与RESOURCE_LOCAL和 MongoDB、CouchDB 等一起工作。

如果您使用 Hibernate OGM 和 Hibernate Search,您会高兴地得知全文查询的创建变得更加简单。现在不再需要为每个FullTextQuery配置数据库检索方法了,现在在启动 Hibernate OGM 引擎时,这将在全局范围内自动发生。


返回顶部