java - 延迟获取类型不适用于相同的对象
问题描述
有用户实体:
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
...
@Column(nullable = false)
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
public Set<UserPermission> permissions;
}
有权限实体:
@Entity
@Table(name = "user_permissions", indexes = {@Index(unique = true, columnList = "id")})
public class UserPermission {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", referencedColumnName = "id")
public User user;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "target_user_id", referencedColumnName = "id")
public User targetUser;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "other_entity", referencedColumnName = "id")
public OtherEntity otherEntity;
}
我使用此代码来获取用户实体:
... get session
... open transaction
// fetching user
final User user = session.find(User.class, id);
// fetching permissions
final Set<UserPermission> userPermissions = user.permissions;
// foreach permissions
// HIBERNATE FETCHES HERE targetUser AND EVERYTHING CONNECTED TO THIS ENTITY, LOOKS LIKE FetchType.EAGER
for (UserPermission permission: userPermissions) {
// there is no code
}
... close transaction
看评论:
// HIBERNATE FETCHES HERE targetUser AND EVERYTHING CONNECTED TO THIS ENTITY, LOOKS LIKE FetchType.EAGER
这意味着,没有任何对 targetUser 的调用,hibernate 就可以获取它。这真的很奇怪。这种行为确实会降低我的应用程序的性能。
我的假设:Hibernate 不能在一个实体中代理两个相似的对象(我的意思是,user 和 targetUser 具有相同的类,hibernate 不能代理这两个对象,这就是它立即获取 targetUser 的原因)
如何解决这个问题呢?有什么建议么?
解决方案
推荐阅读
- angular9 - 在新数据到来时创建要素后,我替换图层源但在地图上仍删除可见的要素(ArcGIS-js-api 4)
- python - 泡菜和追加的区别
- swagger - 如何让 JHipster 6.10 生成开放 api 3.0。代替或补充 Swagger 2 的文档
- ruby - 在 Ruby 中快速访问大型 CSV 文件中的各个行
- php - Eclipse IDE PHP 2020-06 测试服务器
- c# - 将多个刚体分配给功能
- java - 如何在java中打开csv文件时设置新密码
- typescript - 无法使用 Angular CLI 创建组件
- python - 如何接收从烧瓶发送的带有烧瓶的文件?
- python - 如何在插入数据库之前从表输出格式化 Python 变量