我正在尝试懒惰地获取一对一关联的子实体与父实体。我知道我必须激活休眠构建时字节码增强功能。
我的项目建立在 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
}
然后是我的构建.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
因为子实体可为空。
另请注意,我使用的是休眠核心-5.2.12.Final.jar
谢谢
正如您在 High-Performance Java Persistence
GitHub 存储库中的此集成测试中看到的那样,客户端不使用 @MapsId
,因为它会干扰字节码延迟获取。
此外,官方不支持 And 任务,仅支持 Maven 和 Gradle。
如果你使用的是Hibernate 5.2,也许你也应该从Ant迁移。