Hibernate OGM 已不再维护

我很高兴宣布Hibernate OGM 5的第一个Alpha版本!

这个版本基于我们上周发布的Hibernate ORM 5.0 Final。总体来说,更新应该是平滑的,但如果您是手动通过Hibernate API而不是JPA来引导Hibernate OGM,那么您应该准备好一些变化。如果您在WildFly上使用Hibernate OGM,您需要将您的应用程序适配到Hibernate OGM核心模块更改后的模块/槽名称,该名称已从org.hibernate:ogm更改为org.hibernate.ogm:main

查看Hibernate OGM的迁移说明,了解有关从Hibernate OGM早期版本迁移到5.x的更多信息。此外,Hibernate ORM的迁移指南也是推荐阅读的。

对Redis的实验性支持

Hibernate OGM 5带来了对Redis的技术预览支持,它是一个具有许多有趣特性的高性能键/值存储。

非常感谢社区成员Mark Paluch对这个出色的贡献!最初由Seiya Kawashima启动,Mark承担了这个后端的工作,并在很短的时间内完成了一项出色的作品。期待他未来更多的贡献!

一般的映射方法是存储JSON文档作为Redis中的值。例如,考虑以下实体和可嵌入类型

@Entity
public class Account {

    @Id
    private String login;
    private String password;
    private Address homeAddress;

    // getters, setters etc.
}
@Embeddable
public class Address {

    private String street;
    private String city;
    private String zipCode;
    private String country;
    private AddressType type;

    // getters, setters etc.
}
@Embeddable
public class AddressType {

    private String name;

    // getters, setters etc.
}

这将作为以下JSON文档在Redis中的"Account:piere"键下持久化

{
    "homeAddress": {
        "country": "France",
        "city": "Paris",
        "postalCode": "75007",
        "street": "1 avenue des Champs Elysees",
        "type": {
            "name": "main"
        }
    },
    "password": "like I would tell ya"
}

请参阅参考指南中的Redis章节,以了解更多关于这种新方言及其功能的信息。它已经非常强大(几乎所有的Hibernate OGM后端TCK测试都通过了)并且也支持在WildFly中使用。

虽然JSON是Redis用户存储结构化数据的一个流行选择,但我们也将研究其他映射方法。特别是,一个有趣的方法是使用Redis散列来存储实体属性。但这也带来了一些有趣的挑战,例如关于类型转换(散列中只支持String值)以及处理内嵌对象和关联。

因此,如果您面临将对象模型持久化到Redis的挑战,请尝试这个新的后端,并告诉我们您的想法,开放特性请求等。

改进的Map属性映射

现在在MongoDB中(以及新的Redis后端),Map类型的实体属性以更自然的形式持久化。以下是一个示例

@Entity
public class User {

    @Id
    private String id;

    @OneToMany
    @MapKeyColumn(name = "addressType")
    private Map<String, Address> addresses = new HashMap<>();

    // getters, setters etc.
}

在Hibernate OGM的早期版本中,这会被映射到如下MongoDB文档

{
    "id" : 123,
    "addresses" : [
        { "addressType" : "home", "addresses_id" : 456 },
        { "addressType" : "work", "addresses_id" : 789 }
    ]
}

这并不是文档存储映射所期望的。因此,Hibernate OGM 5将创建以下更自然的表现形式

{
    "id" : 123,
    "addresses" : {
        "home" : 456,
        "work" : 789
    }
}

这种表现形式更简洁,应该会改善与其他在相同数据库上工作的客户端的互操作性。如果需要——例如,出于迁移目的——您可以通过hibernate.ogm.datastore.document.map_storage属性强制使用之前的映射。有关详细信息,请参阅参考指南

优化映射目前仅在键列由单个类型为String的列组成时应用。对于其他类型,例如Long或复合键的映射,使用之前的映射,因为JSON/BSON只支持字符串字段名。

对于我们来说,一个开放的问题是是否应该将其他键列类型转换为字符串。例如,如果addresses映射的类型是Map<Long, Address>,可以考虑使用"1"、"2"等字段名来存储映射键。请告诉我们这是否对您有帮助。

多获取操作支持

Hibernate ORM的许多优化之一是懒加载实体的批量获取。这是通过@BatchSize注解控制的。到目前为止,Hibernate OGM不支持批量获取,导致比实际需要的更多数据存储往返。

通过引入MultigetGridDialect来改进了这种情况,这是一个可选的“能力接口”,Hibernate OGM后端可以实现。如果一个后端支持这个合约,Hibernate OGM引擎将利用它,批量获取配置为懒加载的实体,从而提高性能。

目前新的Redis后端正在使用这一功能,MongoDB和Neo4j后端也将很快跟进

升级到MongoDB驱动器3.0

我们已经升级到MongoDB驱动器的3.0版本。Hibernate OGM的大多数用户应该不会受到影响,但将来这将允许我们进行一些性能优化并支持一些新功能。

与驱动程序更新一起,我们对MongoDB后端的连接级选项进行了重组。现在可以通过hibernate.ogm.mongodb.driver.*命名空间配置所有Stringintboolean MongoDB 客户端选项

hibernate.ogm.mongodb.driver.connectTimeout=10000
hibernate.ogm.mongodb.driver.serverSelectionTimeout=3000
hibernate.ogm.mongodb.driver.socketKeepAlive=true

这些选项将直接传递给MongoDB客户端构建器。请注意,之前存在的选项hibernate.ogm.mongodb.connection_timeout已被此新方法取代。

在哪里可以获取它?

您可以使用以下坐标通过Maven等工具获取Hibernate OGM 5.0.0.Alpha1

  • org.hibernate.ogm:hibernate-ogm-core:5.0.0.Alpha1 用于Hibernate OGM核心模块

  • org.hibernate.ogm:hibernate-ogm-<%BACKEND%>:5.0.0.Alpha1 用于您想要使用的NoSQL后端,其中<%BACKEND%>是“mongodb”、“redis”、“neo4j”等之一。

或者,您可以从SourceForge下载包含所有二进制文件、源代码和文档的存档。

我们始终非常期待您的反馈。变更日志详细说明了有哪些更新供您使用。通过以下渠道与我们联系


返回顶部