Sch*_*tey 9 java spring jpa spring-data spring-data-jpa
我目前正在尝试评估使用Spring Data JPA的可能性.
试图使用Projections,我目前只是试图获取特定属性Eager.
我有一个简单的实体,它懒惰引用另一个带有外键的实体.我现在想为前一个实体定义不同的预测."原始"属性很好地投射到投影界面中,但是尝试投影另一个实体/投影会导致它仍然是延迟加载的.
我现在想告诉Spring/JPA急切地在预测中加载实体/投影.一种可能的方法是使用EntityGraphs(它们运行良好),但我必须使用不同的图形为每个方法创建存储库.问题是其他方式有哪些?
例:
实体买方:
@Entity
public class Buyer {
private Integer id;
private String someProperty;
private User user;
...
@OneToOne(
fetch = FetchType.LAZY)
@JoinColumn(
name = "CAB_USR_ID",
referencedColumnName = "ID",
updatable = false,
nullable = true,
foreignKey = @ForeignKey(name = "FK_CAB_USR"))
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
Run Code Online (Sandbox Code Playgroud)
实体用户:
@Entity
public class User {
private Integer id;
private String name;
...
}
Run Code Online (Sandbox Code Playgroud)
投影买方
public interface BuyerCProjection {
Integer getId();
UserProjection getUser();
}
Run Code Online (Sandbox Code Playgroud)
投影用户
public interface UserProjection {
Integer getId();
String getName();
}
Run Code Online (Sandbox Code Playgroud)
我想用的存储库
public interface BuyerRepository extends Repository<Buyer, Integer> {
<T> List<T> findBy(Class<T> t);
}
Run Code Online (Sandbox Code Playgroud)
我认为没有办法指示 JPA/Hibernate 使用投影急切地获取。投影是在执行获取查询后应用的,因此修改查询为时已晚。
有一个折衷的解决方案,使用jackson-datatype-hibernate模块并FORCE_LAZY_LOADING启用该功能。这会强制初始化并返回投影中的所有延迟加载对象。
请注意,这不如使用实体图或JOIN FETCH. 其行为与调用Hibernate.initialize每个延迟加载的对象、执行另一个选择查询相同。所以结果是 N+1 个选择。但这可能是一个很好的开始方式。当某些事情开始变慢时,您仍然可以通过编写连接获取或实体图查询来优化。
| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |