【问题标题】:Hyperjaxb3 naming strategy change between 0.5.6 and 0.6.2Hyperjaxb3 命名策略在 0.5.6 和 0.6.2 之间变化
【发布时间】:2018-01-11 19:24:55
【问题描述】:

我们有一个重要的代码库,它利用 Hyperjaxb3 来注释使用 xjc(以及其他 xjc 插件,包括自制的插件)生成的 Java 类。

我们正在尝试从 Hyperjaxb3 0.5.6 升级到 0.6.2,但遇到了一个重大问题,即这些版本之间存在明显的命名策略更改。

具体来说,在 0.5.6 中,像“OneTwo”这样的 complexType 名称会导致表名“ONETWO”,而在 0.6.2 中,表名是“ONE_TWO”。列名也一样。

我们非常倾向于不重构数百个查询来适应这样的命名变化(尽管更新、更传统的 SQL 命名当然是有意义的——我们希望它是六年前这个项目开始时的默认行为) .

有没有一种简单的方法可以切换到旧的命名策略?如果做不到这一点,您能否提供有关如何使用自定义命名策略扩展 Hyperjaxb3 的详细信息?

查看了this testthis one,我们并不清楚究竟需要对我们的pom 做什么来指定不同的命名策略类,而Extension Guide 目前是空的。

  <plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <configuration>
      <extension>true</extension>
      <plugins>
        <plugin>
          <groupId>org.jvnet.jaxb2_commons</groupId>
          <artifactId>jaxb2-basics</artifactId>
          <version>${jaxb.commons.version}</version>
        </plugin>
        <plugin>
          <groupId>org.jvnet.hyperjaxb3</groupId>
          <artifactId>hyperjaxb3-ejb-plugin</artifactId>
          <version>${hyperjaxb3.version}</version>
        </plugin>
        <plugin>
          <groupId>${project.groupId}</groupId>
          <artifactId>jaxb-x12</artifactId>
          <version>${project.version}</version>
        </plugin>
      </plugins>
      <args>
        <arg>-enableIntrospection</arg>
        <arg>-Xcopyable</arg>
        <arg>-Xequals</arg>
        <arg>-XhashCode</arg>
        <arg>-Xinheritance</arg>
        <arg>-Xhyperjaxb3-ejb</arg>
        <arg>-Xx12</arg>
      </args>
    </configuration>
  </plugin>

【问题讨论】:

    标签: hyperjaxb


    【解决方案1】:

    这里是HJ3的作者。

    看看custom-naming 测试项目。它实现并配置自定义命名策略。

    解决方案由两部分组成:implementation of the naming strategyconfiguration of this implementation

    您的命名实现必须实现org.jvnet.hyperjaxb3.ejb.strategy.naming.Naming 接口。最简单的方法是从 org.jvnet.hyperjaxb3.ejb.strategy.naming.impl.DefaultNaming 继承。

    要进行配置,您必须创建一个资源/org/jvnet/hyperjaxb3/ejb/plugin/custom/applicationContext.xml,它基本上是一个 Spring XML 配置。在那里,定义一个名为 naming 的 bean:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
    
        <bean name="naming" class="com.acme.foo.MyNaming">
            <property name="reservedNames" ref="reservedNames"/>
        </bean>
    
    </beans>
    

    这将覆盖标准命名策略。

    【讨论】:

    • 我也有同样的问题。试图复制自定义命名测试项目的结构,但看起来生成的实体没有受到影响。有什么方法可以确保自定义命名类确实被调用了?
    • @Arch 抛出一个异常,看看它是否真的被抛出了。
    • 嗨@lexicore,我确实做到了,但没有运气。结合您对 SO 上不同问题的回答,我已经创建了一个小项目(基于 github 示例),其中包含覆盖命名策略的类和资源中的 spring xml bean。我检查了 xml 是否包含在生成的 jar 中,并将该 jar 用作项目中的依赖项,我尝试使用 maven 插件从 XSD 生成实体。不幸的是,什么也没发生。
    • @Arch 在github.com/highsource/hyperjaxb3-support 下的某处向我发送带有示例项目的 PR。我来看看可能是什么问题。
    猜你喜欢
    • 2013-09-29
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多