首页 > 解决方案 > 延迟获取类型不适用于相同的对象

问题描述

有用户实体:

@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 的原因)

如何解决这个问题呢?有什么建议么?

标签: javahibernatelazy-loading

解决方案


推荐阅读