首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jaxb、hyperjaxb3、jpa2、jts、hibernate-spatial,postgis在hyperjaxb将JTS getter标记为@瞬态时失败。

使用jaxb、hyperjaxb3、jpa2、jts、hibernate-spatial,postgis在hyperjaxb将JTS getter标记为@瞬态时失败。
EN

Stack Overflow用户
提问于 2012-05-31 20:20:46
回答 1查看 1.2K关注 0票数 0

我的同事对我坚持代码生成表示遗憾,但我决心证明这个特定的链是可以完成的。下面的示例是从我的项目中简化的(因此没有经过类型化的测试);我很快就会创建一个测试工具。目前使用hibernate 4.1.4,hibernate-spatial 1.1.1,Hyperjaxb3-EJB插件0.5.6。

我从一个模式开始,它使用的位置元素的类型是一个简单的字符串扩展名:

代码语言:javascript
复制
  <xsd:simpleType name="wktPoint">
    <xsd:restriction base="xsd:string">
    </xsd:restriction>
  </xsd:simpleType>

我使用bindings.xjb自定义来使用jaxb:javaType将xmlType wktPoint映射到JTS Point javaType,因为我希望将JTS Point字段映射到postgis几何列:

代码语言:javascript
复制
<jaxb:javaType name="com.vividsolutions.jts.geom.Point" xmlType="wktPoint" parseMethod="test.Reader.readWKTPoint" printMethod="test.Writer.writeWKTPoint" />

稍后在bindings.xjb中,我开始使用annox:批注自定义位置元素:

代码语言:javascript
复制
<jaxb:bindings node="xsd:complexType[@name='MyType']//xsd:element[@name='Position']">
  <annox:annotate target="getter">
    <annox:annotate annox:class="javax.persistence.Basic"/>        
    <annox:annotate annox:class="javax.persistence.Column" name="POSITION" columnDefinition="GEOMETRY"/>
    <annox:annotate annox:class="org.hibernate.annotations.Type" type="org.hibernatespatial.GeometryUserType">
      <annox:annotate annox:field="parameters">
        <annox:annotate annox:class="org.hibernate.annotations.Parameter" name="dialect" value="postgis"/>
      </annox:annotate>
    </annox:annotate>
  </annox:annotate>      
</jaxb:bindings>

但是,这将在getPosition中生成以下MyType.java方法:

代码语言:javascript
复制
/**
 * Gets the value of the position property.
 * @return
 *     possible object is
 *     {@link String }
 */
@Transient
@Basic
@Column(columnDefinition = "GEOMETRY", name = "POSITION")
@Type(parameters = {
    @Parameter(name = "dialect", value = "postgis")
}, type = "org.hibernatespatial.GeometryUserType")
public Point getPosition() {
    return position;
}

因此,当我启动应用程序,而jpa/hibernate开始初始化表时,它会跳过POSITION列(因为它被标记为@瞬态)。

我怎样才能防止“临时”出现?我似乎需要说服Hyperjaxb,我们将能够将JTS Point类型直接写入数据库(这就是@Type的全部内容,表明我们希望hibernatespatial在读取和写入位置时使用后置方言)。对怎么做有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2012-06-03 06:19:00

0.5.6的hyperjaxb只是没有正确地处理绑定定制。我构建了一个0.5.7快照,它修改了org.jvnet.hyperjaxb3.ejb.strategy.mapping AttributesMapping.getAttributeMapping(),这样定制的jaxb绑定就不会再被标记为瞬态的了。我给它做了以下后遗症的检查:

代码语言:javascript
复制
if (isFieldOutlineBasic(fieldOutline)) {
    ...
} else if (isFieldOutlineComplex(fieldOutline)) {
    ...
} else {
    if (fieldOutline.getRawType() instanceof JClass) {
        return context.getBasicMapping();
    }
}

这包括了我的定制,它总是以JDirectClass(点)的形式出现。一旦进行了更改,将使用正确的几何类型创建postgis表,现在我可以接受一个WKT点字符串,将unmarshall作为JTS,然后将其作为PostGIS几何保存。我还需要重新构建Hibernate4 (现在使用的是1.1.2快照)来使用Hibernate4。我将把这项工作提交给Karel,我也会将Hyperjaxb的变更提交给Aleksei,希望将来的版本会更加健壮。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10840702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档