为 DB2 Spatial 映射 JPA
Posted
技术标签:
【中文标题】为 DB2 Spatial 映射 JPA【英文标题】:Mapping JPA for DB2 Spatial 【发布时间】:2013-07-24 07:29:38 【问题描述】:我目前正在开发一个基于 WebSphere Application Server 7 和 DB2 Spatial Extender 的应用程序,我想将 JPA 用于数据访问层。
我在我的数据库中设置了一个非常简单的表用于测试目的:
JMTEST (id integer | position db2gse.st_point)
挑战是将 position 列 (db2gse.st_point) 映射到我的 JPA 实体的字段
到目前为止,我发现的唯一可行的解决方案是使用 Hibernate 作为 JPA 实现,以便我可以使用 @ColumnTransformer 注释:
@Entity
@NamedQuery(name = "getAllRecords", query = "SELECT j FROM Jmtest j")
public class Jmtest implements Serializable
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@ColumnTransformer(read="db2gse.ST_AsText(position)",write="db2gse.ST_PointFromText(?,1003)")
private String position;
由于我使用的是 WebSphere 7,它带有 JPA 1.0 和 IBM 或 OpenJPA 实现。 不幸的是,恐怕我将不得不坚持这些(不可能使用 JPA 2.0 也不可能使用替代的 JPA 提供程序)
我在 IBM 或 OpenJPA 实现中找不到 @ColumnTransformer 的等效项。如果存在,有人可以向我解释我应该使用什么吗?
如果没有,您能否就如何使用 IBM/OpenJPA 实现将 DB2Spatial 列映射到 JPA 实体字段给我一些建议?
非常感谢。
【问题讨论】:
【参考方案1】:查看OpenJPA 中存在的@Factory
和@Externalizer
注释。
【讨论】:
我做了,但它似乎不能满足我的需求。实际上,字段转换是由 java 方法执行的,而在我的例子中,转换只能由特定的 DB2Spatial SQL 函数(db2gse.ST_AsText 和 db2gse.ST_PointFromText)进行【参考方案2】:实际上你并没有绑定到 JPA 1。你可以安装一个feature pack 以获得 JPA 2 的支持。
之后,您可以将 WAS 配置为使用 third party jpa provider,如 Hibernate。
在没有功能包的情况下也可以使用第三方提供商,但是您必须使用使用 jpa 1 的旧版本。
【讨论】:
是的,你是对的,我知道我可以安装 JPA 2 的功能包。但正如我所说,我宁愿避免它,因为我不确定它不会干扰已经安装在 WAS 上并使用开箱即用的 JPA1 实现 (OpenJPA) 的其他应用程序。我能够在 WAS7 上将 Hibernate 用作 JPA1 提供程序(没有 FeaturePack),但由于 JPA1 兼容的 Hibernate 版本相当旧,因此没有 @ColumnTransformer 注释。我仍然找不到任何与 OpenJPA 等效的工具 嗯,实际上我们在没有功能包的 WAS 7 上使用 JPA 2。一个解决方法是使用 Spring(我们仍然使用它)并通过 spring 加载 JPA,如果你给你的 persistence.xml 一个不同的名字 WAS 不会选择它,你可以通过 Spring 用 persistenceXMLLocation (static.springsource.org/spring/docs/3.0.x/javadoc-api/org/…) 加载它设置。以上是关于为 DB2 Spatial 映射 JPA的主要内容,如果未能解决你的问题,请参考以下文章
微软Hololens学院教程-Hologram 230-空间映射(Spatial mapping )
Hololens官方教程精简版 - 07. Spatial mapping(空间映射)
Hololens官方教程精简版 - 07. Spatial mapping(空间映射)