尽管Hibernate已经支持SAP HANA有一段时间了,但相应的方言仅实现了基本功能,并且没有来自SAP的官方支持。
例如,一些功能,如数据库生成的标识列和表注释,不可用。
最近发布的Hibernate ORM 5.2.12版本提供了对SAP HANA的改进支持,允许使用Hibernate ORM框架提供的所有功能。
本版本获得SAP HANA团队的全额支持。我们将持续更新此开源项目以提供更多高级功能。
为什么我应该使用SAP HANA平台?
简而言之,随着SAP HANA内存计算能力的加入,任何使用数据库的项目现在都可以将更高级的计算推送到数据库层,以下是一些好处
-
SAP HANA提供了强大的高级功能,如实时分析、全文搜索和分析、地理空间数据处理、图处理和JSON文档存储。使用这些多模式处理能力,您可以在数据库中直接执行所需的所有数据处理,无需外部组件、应用程序层之间的数据传输或数据复制。
-
由于SAP HANA的列式内存数据存储,可以通过删除所有冗余数据(如物化中间视图或辅助索引)来显着减少应用程序的数据占用。此外,SAP HANA内部压缩存储的数据,从而进一步减小数据库的大小。
-
SAP HANA内存技术允许对单个数据集进行事务和数据分析,简化了数据景观,并使单个平台上能够进行高级多模型数据处理。使用SAP HANA的Hibernate方言,Java应用程序现在也可以利用这些优势。
有什么新功能?
数据库生成的标识列
SAP HANA方言现在支持生成值使用的IDENTITY生成类型。
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
在数据库级别,这相当于具有GENERATED BY DEFAULT AS IDENTITY属性的列。
"ID" INTEGER CS_INT GENERATED BY DEFAULT AS IDENTITY
改进对LOB列的处理
SAP HANA JDBC驱动程序对LOB的处理方式与JDBC规范不同,即LOB对象(Blob、Clob、NClob)在事务结束时并不保持有效,而是在对应的ResultSet
关闭时关闭。由于Hibernate依赖于JDBC规范,这会导致在SAP HANA上处理LOB时出现意外错误。
当前SAP HANA Hibernate方言为此问题实现的一个解决方案是在ResultSet
关闭之前,将所有LOB对象实体化并在应用程序端缓存它们。这种方法的缺点是,无法按需从服务器流式传输LOB数据,并且将所有LOB实体化会导致应用程序端的内存使用增加,尤其是在处理大型LOB时。设计应用程序时,开发者需要意识到这一点,但至少在大多数用例中它应该是一个合理的解决方案。
可以通过Hibernate参数hibernate.dialect.hana.max_lob_prefetch_size
控制缓存机制的行为。此参数的值应与SAP HANA配置参数indexserver.ini/session/max_lob_prefetch_size
的值相对应。所有大于此值的LOB将由SAP HANA Hibernate方言缓存。
SAP HANA空间方言
Hibernate 5.2.12版本还引入了SAP HANA的SpatialDialect
实现。该方言允许在使用Hibernate Spatial模块时使用SAP HANA地理空间功能。要使用它,请在持久化配置中指定HANA空间方言。
<property name="hibernate.dialect" value="org.hibernate.spatial.dialect.hana.HANASpatialDialect"/>
然后您可以在实体中运行使用几何类型,并对它们执行空间查询。
@Entity
public class Geography {
private Point<C2D> position;
}
// Select all events within a region
TypedQuery<Event> eventQuery = entityManager.createQuery(
"select e from Event e where within(actionGeo.position, :area) = true",
Event.class);
// Create a polygon describing a box around Europe
WktDecoder decoder = Wkt.newDecoder(Wkt.Dialect.HANA_EWKT);
Polygon<?> europeBox = (Polygon<?>) decoder.decode("POLYGON((35 -10, 35 30, 71 30, 71 -10, 35 -10))");
eventQuery.setParameter("area", europeBox);
// Return all events within the Europe box
return eventQuery.getResultList();
接下来是什么?
由于SAP HANA Hibernate方言和SAP HANA Hibernate空间方言没有太多要做的事情,我们目前正在研究如何最好地利用SAP HANA的高级功能。
我们正在研究的一个领域是如何通过Hibernate Search项目将SAP HANA全文搜索和文本分析功能与Hibernate集成。
另一个我们正在考虑的领域是如何通过Hibernate OGM项目将SAP HANA NoSQL功能(如SAP HANA文档存储和SAP HANA图引擎)集成到Hibernate中。
敬请关注这些主题的最新更新。
如何开始?
如果您想在SAP HANA上试用Hibernate,您可以免费获得SAP HANA Express Edition版本。只需访问 http://sap.com/sap-hana-express,填写注册表单,然后下载SAP HANA Express Edition的二进制文件或使用您喜欢的云服务提供商设置SAP HANA Express Edition实例。
有关如何开始的信息,请查看www.sap.com/developer/topics/sap-hana-express.html上的信息。在这里,您可以找到有关SAP HANA Express Edition的各个主题的教程。