我很高兴宣布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
。
对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.*
命名空间配置所有String
、int
和boolean
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下载包含所有二进制文件、源代码和文档的存档。
我们始终非常期待您的反馈。变更日志详细说明了有哪些更新供您使用。通过以下渠道与我们联系