如何在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
相关产品推荐
相关产品推荐

