【问题标题】:using jaxb, hyperjaxb3, jpa2, jts, hibernate-spatial, postgis fails when hyperjaxb marks the JTS Point getter as @Transient当 hyperjaxb 将 JTS Point getter 标记为 @Transient 时,使用 jaxb、hyperjaxb3、jpa2、jts、hibernate-spatial、postgis 失败
【发布时间】:2012-06-06 03:06:28
【问题描述】:

我的同事对我对代码生成的坚持感到遗憾,但我决心证明这个特定的链是可以完成的。下面的示例是从我的项目中简化的(因此未经测试作为输入);我将很快创建一个测试工具。目前使用休眠 4.1.4、休眠空间 1.1.1、hyperjaxb3-ejb-plugin 0.5.6。

我从一个使用类型为简单字符串扩展的 Position 元素的架构开始:

  <xsd:simpleType name="wktPoint">
    <xsd:restriction base="xsd:string">
    </xsd:restriction>
  </xsd:simpleType>

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

<jaxb:javaType name="com.vividsolutions.jts.geom.Point" xmlType="wktPoint" parseMethod="test.Reader.readWKTPoint" printMethod="test.Writer.writeWKTPoint" />

稍后在 bindings.xjb 中,我开始使用 annox:annotation: 自定义 Position 元素:

<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>

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

/**
 * 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 列(因为它被标记为@Transient)。

如何防止@Transient 出现?看来我需要说服 Hyperjaxb 我们将能够将 JTS Point 类型直接写入数据库(这就是所有 @Type 的内容,表明我们希望 hibernatespatial 在读取和写入位置时使用 postgis 方言)。关于如何做到这一点的任何想法?

【问题讨论】:

  • 我正在仔细研究 hyperjaxb3,我发现我的职位的 FieldOutline 既不是基本的也不是复杂的(因此标记为@Transient),因为 jaxb:javaType 自定义。由于自定义成功,FieldOutline 的 JType 显示为 com.sun.codemodel.JDirectClass(Point) ,所以我仍然卡住...
  • 你为什么要乱用 xml 来生成代码?你应该反过来做,注释代码,你应该没问题。
  • 哈!抱歉,siebz0r,但您的论点未能使我偏离我的道路 :) 这里的模式是更大的模式和 wsdl 集合的一部分,就像我们实现的大多数 Web 服务一样。根据我的经验,它已被证明具有更高的互操作性和强大的功能,以确保控制文件是一流的......从防弹模式和 wsdl 开始,使其他人能够使用他们选择的任何支持 impl 来实现客户到我们的服务(只要他们的客户说我们的流利的架构)。同时,我们开始生成我们的服务的主干,并编写了非常少的胶水代码,我们就在路上了。除了...

标签: hibernate jpa postgis jts hyperjaxb


【解决方案1】:

0.5.6 hyperjaxb-ejb-plugin 只是没有正确处理绑定自定义。我构建了一个 0.5.7-SNAPSHOT,它修改了 org.jvnet.hyperjaxb3.ejb.strategy.mapping AttributesMapping.getAttributeMapping(),这样我的自定义 jaxb 绑定将不再被标记为 Transient。我给了它以下后备检查:

if (isFieldOutlineBasic(fieldOutline)) {
    ...
} else if (isFieldOutlineComplex(fieldOutline)) {
    ...
} else {
    if (fieldOutline.getRawType() instanceof JClass) {
        return context.getBasicMapping();
    }
}

这涵盖了我的自定义,它总是显示为 JDirectClass(Point)。进行更改后,使用正确的几何类型创建了 postgis 表,我现在可以接收 WKT 点字符串,将其解组为 JTS 点,然后使用 JPA 将其作为 PostGIS 几何图形保存。我确实还需要重建 Hibernate Spatial(现在使用 1.1.2-SNAPSHOT)以使用 Hibernate4。我会将这项工作提交给 Karel Maesen,并将 Hyperjaxb 更改提交给 Aleksei Valikov,希望未来的版本会更加强大。

【讨论】:

  • 很酷,你明白了。 -- lexi 请把补丁发给我,我会考虑 0.5.7。实际上,您只需要一种方法来关闭 @Transient 注释,以“退后,我会自己做”。我想知道 hj:ignore 是否会起作用...
  • 感谢收看。我在这里提交了问题(和补丁):jira.highsource.org/browse/HJIII-97
猜你喜欢
  • 1970-01-01
  • 2017-04-03
  • 1970-01-01
  • 2015-07-05
  • 2014-11-17
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 2021-05-09
相关资源
最近更新 更多