我目前正在使用Hibernate的@LazyToOne
注释。
由于我正在从Hibernate切换到JPA,我想知道在JPA中是否有@LazyToOne
,或者是否有其他注释在JPA中提供相同的功能?
我目前正在使用Hibernate的@LazyToOne
注释。
由于我正在从Hibernate切换到JPA,我想知道在JPA中是否有@LazyToOne
,或者是否有其他注释在JPA中提供相同的功能?
@LazyToOne
和LazyToOneOption
传统的@LazyToOne
注解提供以下选项:
FALSE
PROXY
NO_PROXY
LazyToOneOption.FALSE
FALSE
选项相当于JPA的FetchType.EAGER
注解,因此应避免使用它,因为它可能会导致严重的性能问题。
LazyToOneOption.PROXY
PROXY
选项相当于JPA [FetchType.LAZY
]策略。但是,您应该优先使用JPA @OneToOne
或@ManyToOne
关联的fetch
属性。
LazyToOneOption.NO_PROXY
当在父侧使用@OneToOne
关联时,此策略很有用。
因此,假设您有以下Post
和PostDetails
实体:
如果Post
映射了这个一对一表关系的父侧:
@OneToOne(
mappedBy = "post",
fetch = FetchType.LAZY,
cascade = CascadeType.ALL
)
private PostDetails details;
FetchType.LAZY
策略,如果我们想获取Post
实体,仍然需要进行数据提取。Post post = doInJPA(entityManager -> {
return entityManager.find(Post.class, 1L);
});
PostDetails
将会被急切地获取:
SELECT p.id AS id1_0_0_,
p.title AS title2_0_0_
FROM post p
WHERE p.id = 1
SELECT pd.id AS id1_1_0_,
pd.created_by AS created_2_1_0_,
pd.created_on AS created_3_1_0_
FROM post_details pd
WHERE pd.id = 1
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>${hibernate.version}</version>
<executions>
<execution>
<configuration>
<enableLazyInitialization>true</enableLazyInitialization>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
此外,我们还需要使用 NO_PROXY
策略:
@OneToOne(
mappedBy = "post",
fetch = FetchType.LAZY,
cascade = CascadeType.ALL
)
@LazyToOne(LazyToOneOption.NO_PROXY)
private PostDetails details;
通过这个改变,父类的@OneToOne
关联将会被延迟加载。
optional=true
,否则此选项与 @LazyToOne
不同。可为空的一对一引用始终是急加载。 - ar31jpql
,例如:User user = em.createQuery("SELECT NEW com.model.User(u.id, u.name, u.password)
FROM User u WHERE u.id = :id", User.class)
.setParameter("id", 1L)
.gerSingleResult();`
这可能解决你的问题。但是,你必须记得编写默认构造函数。
应该是这样的
@OneToOne(fetch = FetchType.LAZY, optional=false)