尽管Hibernate已经支持SAP HANA有一段时间了,但相应的方言仅实现了基本功能,并且没有来自SAP的官方支持。

例如,一些功能,如数据库生成的标识列和表注释,不可用。

最近发布的Hibernate ORM 5.2.12版本提供了对SAP HANA的改进支持,允许使用Hibernate ORM框架提供的所有功能。

本版本获得SAP HANA团队的全额支持。我们将持续更新此开源项目以提供更多高级功能。

为什么我应该使用SAP HANA平台?

简而言之,随着SAP HANA内存计算能力的加入,任何使用数据库的项目现在都可以将更高级的计算推送到数据库层,以下是一些好处

  1. SAP HANA提供了强大的高级功能,如实时分析、全文搜索和分析、地理空间数据处理、图处理和JSON文档存储。使用这些多模式处理能力,您可以在数据库中直接执行所需的所有数据处理,无需外部组件、应用程序层之间的数据传输或数据复制。

  2. 由于SAP HANA的列式内存数据存储,可以通过删除所有冗余数据(如物化中间视图或辅助索引)来显着减少应用程序的数据占用。此外,SAP HANA内部压缩存储的数据,从而进一步减小数据库的大小。

  3. 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方言现在支持表和列注释。

@Entity
@Table(comment = "Table comment", appliesTo = "Post")
public class Post {
        @Id
        private int id;
}

在数据库级别,这相当于在表创建语句末尾的“注释”属性。

create column table Post (id integer generated by default as identity) comment 'Table comment'

锁定改进

之前SAP HANA Hibernate方言的实现在使用锁时并不总是生成正确的SQL语句。这个问题已经修复,以确保在所有情况下都能正确工作。

JDBC驱动程序改进

Hibernate ORM的一些功能依赖于SAP HANA JDBC驱动程序未实现的功能。这些缺失的功能已经添加,并在SAP HANA JDBC驱动程序版本2.2.1中发布。因此,如果您计划在SAP HANA上使用Hibernate,请确保使用至少这个版本的SAP HANA JDBC驱动程序。

接下来是什么?

由于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的各个主题的教程。


返回顶部