我试图懒惰地获取一对一关联的子实体 与父实体。我知道我必须激活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
由于
答案 0 :(得分:1)
正如您在我的书“高性能Java持久性GitHub存储库”中的this test中所看到的,客户端不使用@MapsId
,因为它会干扰字节码延迟提取。
此外,官方不支持And任务,只有Maven和Gradle。
如果您使用的是Hibernate 5.2,也许您也应该从Ant迁移。