如何为hibernate构建时字节码增强编写Ant任务

时间:2017-11-07 13:25:29

标签: spring hibernate ant

我试图懒惰地获取一对一关联的子实体 与父实体。我知道我必须激活hibernate构建时字节码增强。

我的项目是基于Ant构建的,我相信现在支持Ant任务 由Luis Barreiro贡献。我的挑战是,我现在不擅长写作 蚂蚁脚本。我没有运气就尝试了很多。子实体 虽然设置为懒惰取得每次我尝试时总是热切地提取 只检索父实体。

这是我的实体类

@Entity()
@Table(name = "parent")
public class Parent implements Serializable {

    //Basic properties excluded for brevity

    @OneToOne(mappedBy = "parent", cascade = CascadeType.PERSIST, orphanRemoval = true, fetch = FetchType.LAZY)
    @LazyToOne(LazyToOneOption.NO_PROXY)
    private Child child;

    //getters and setters excluded for brevity

}

@Entity()
@Table(name = "child")
public class Child implements Serializable {

    //Basic properties excluded for brevity

    @OneToOne(fetch = FetchType.LAZY)
    @MapsId
    @JoinColumn(name = "parent_id")
    private Parent parent;

    //getters and setters excluded for brevity

}

然后我的build.xml

<?xml version="1.0" encoding="UTF-8"?>
<project name="MyProject" default="default" basedir=".">
    <description>Builds, tests, and runs the project MyProject.</description>
    <import file="nbproject/build-impl.xml"/>

    <property name="lib.dir" value="./lib" />
    <property name="classes.dir" value="./classes" />

    <path id="lib.class.path">
        <fileset dir="${lib.dir}">
            <include name="**/*.jar" />
        </fileset>
    </path>

    <target name="enhance" depends="compile">
        <taskdef name="enhance" classname="org.hibernate.tool.enhance.EnhancementTask">
            <classpath path="${classes.dir}"/>
            <classpath refid="lib.class.path"/>
        </taskdef>
        <enhance base="${classes.dir}" dir="${classes.dir}" 
             failOnError="true" 
             enableLazyInitialization="true" 
             enableDirtyTracking="true" 
             enableAssociationManagement="true" 
             enableExtendedEnhancement="true" />
    </target>

</project>

我需要有关如何正确编写ant任务才能使其正常工作的帮助。 除了蚂蚁任务之外还应该指出任何其他观察。

注意:我无法使用optional = false,因为子实体可以为空。

另请注意,我正在使用hibernate-core-5.2.12.Final.jar

由于

1 个答案:

答案 0 :(得分:1)

正如您在我的书“高性能Java持久性GitHub存储库”中的this test中所看到的,客户端不使用@MapsId,因为它会干扰字节码延迟提取。

此外,官方不支持And任务,只有Maven和Gradle。

如果您使用的是Hibernate 5.2,也许您也应该从Ant迁移。