You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HyperJaxb3中将生成的实体属性标注为Transient?

How to Mark a Field as Transient in HyperJaxb Generated Classes

我完全懂你现在的困扰——想把ProcessInstanceGroupDAO里的lastActivityTime字段在HyperJaxb生成的类里标记为@Transient,但旧文档无法访问,GitHub文档没解决问题,试了embeddable和generated-id方案也没成功。别慌,下面给你说正确的配置方式:

核心思路:用HyperJaxb绑定文件配置字段属性

HyperJaxb是通过自定义绑定文件(通常命名为binding.xjb)来控制生成的JPA注解的,我们需要在这个文件里明确标记目标字段为transient。

假设你的XSD片段是这样的:

<xsd:complexType name="ProcessInstanceGroupDAO">
  <xsd:sequence>
    <!-- 其他字段 -->
    <xsd:element name="lastActivityTime" type="xsd:dateTime" minOccurs="0"/>
  </xsd:sequence>
</xsd:complexType>

步骤1:创建绑定文件binding.xjb

在你的项目资源目录下创建这个文件,添加如下配置:

<jaxb:bindings xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
               xmlns:hj="http://jaxb2-commons.dev.java.net/basic/hijack"
               xmlns:jpa="http://java.sun.com/xml/ns/persistence/orm"
               version="2.1">

    <!-- 绑定到你的ProcessInstanceGroupDAO复杂类型 -->
    <jaxb:bindings schemaLocation="your-schema.xsd" node="/xsd:schema/xsd:complexType[@name='ProcessInstanceGroupDAO']">
        <!-- 定位到lastActivityTime字段并标记为transient -->
        <jaxb:bindings node="xsd:sequence/xsd:element[@name='lastActivityTime']">
            <hj:property>
                <hj:transient/>
            </hj:property>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

注意:如果使用的是HyperJaxb 3.x版本,hj命名空间要改成https://hyperjaxb3.jvnet.org/basic/hijack,其他配置逻辑一致。

步骤2:在构建脚本中引入绑定文件

以Maven为例,你需要在maven-jaxb2-plugin的配置里指定这个绑定文件,确保HyperJaxb插件能读取到:

<plugin>
    <groupId>org.jvnet.jaxb2.maven2</groupId>
    <artifactId>maven-jaxb2-plugin</artifactId>
    <version>0.14.0</version>
    <executions>
        <execution>
            <goals>
                <goal>generate</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <bindingDirectory>${project.basedir}/src/main/resources</bindingDirectory>
        <bindingIncludes>
            <include>binding.xjb</include>
        </bindingIncludes>
        <extension>true</extension>
        <args>
            <arg>-Xhyperjaxb3</arg>
        </args>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>org.jvnet.hyperjaxb3</groupId>
            <artifactId>hyperjaxb3-ejb-plugin</artifactId>
            <version>0.6.0</version>
        </dependency>
    </dependencies>
</plugin>

验证结果

重新执行代码生成后,你会看到生成的ProcessInstanceGroupDAO类里的lastActivityTime字段已经带上了@Transient注解:

@Transient
protected XMLGregorianCalendar lastActivityTime;

为啥之前的方案没用?

  • embeddable/embeddable属性:这个是用来处理嵌入实体类的,和标记字段为transient完全不相关;
  • generated-id构造:这是用来生成JPA主键的,也和transient字段的配置无关。

内容的提问来源于stack exchange,提问作者suat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:39:01