我使用hbm文件通过Ant任务使用hbm2java生成我的POJO对象。我正在尝试使用XML:中的org.hibernate.type.EnumType将一些硬编码的值更改为Enum
<set name="myCollection" table="table_name" lazy="true">
<key column="ref_id"/>
<element column="col" not-null="true">
<type name="org.hibernate.type.EnumType">
<param name="enumClass">my.path.MyEnum</param>
<param name="type">12</param>
<param name="useNamed">true</param>
</type>
</element>
</set>
我第一次尝试运行hbm2java导致MyEnum的"Enum class not found"。我意识到我需要将我的类添加到我的ant文件中的类路径:
<hibernatetool destdir="${src.dir}">
<classpath>
<path location="${build.dir}"/>
</classpath>
<configuration configurationfile="${basedir}/sql/hibernate.cfg.xml" >
<fileset dir="${src.dir}" id="id">
<include name="model/*.hbm.xml" />
</fileset>
</configuration>
<hbm2java ejb3="false" jdk5="true" />
</hibernatetool>
这次一切都正常,但事实证明这只是因为我已经编译了${src.dir}
到${build.dir}
中的所有内容。如果我从"干净"状态开始,我会再次得到"Enum class not found",因为它有一个循环依赖项:为了编译代码,我需要POJO。但是为了得到POJO,我需要编译后的代码。
我能想到的唯一解决方案是首先编译enum包中的所有内容,然后运行hbm2java,然后编译其余内容。
这对我来说似乎很奇怪,但这是最好的解决方案吗或者还有其他我没有想到的解决方案吗例如,有没有办法让它查看我的源代码?
我最终使用了我提出的解决方案,添加了一个ant任务,该任务只编译运行hbm2java所需的类。该任务名为"构建hibernate依赖项",所以我只需为它在我的hbm2java目标中添加一个dependents属性:
<target name="hbm2java" depends="build-hibernate-dependencies">
<hibernatetool destdir="${src.dir}">
...
</hibernatetool>
</target>
目标"构建休眠依赖项"将枚举编译到构建目录:
<target name="build-hibernate-dependencies">
<mkdir dir="${build.dir}" />
<javac destdir="${build.dir}">
<src path="${src.dir}/enums" />
</javac>
</target>
在那之后,我现在可以编译整个项目了。