懒惰的收藏品在jhipster应用程序中急切地获取

时间:2015-10-25 12:03:22

标签: java hibernate jpa lazy-loading jhipster

好的,我最近一直在用新生成的项目调查jhipster。在调试身份验证过程(基于令牌)的过程中,我了解到我并没有明确地获得 @Transactional 原则和实体中的延迟关联加载。所以jhipster生成了这样的2个实体,DAO和服务层: (原始代码,我没有改变任何内容)

  1. 用户

    @Entity
    @Table(name = "jhi_user")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    public class User extends AbstractAuditingEntity implements Serializable {
    
        // omitted fields
    
        @JsonIgnore
        @ManyToMany
        @JoinTable(
            name = "jhi_user_authority",
            joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
            inverseJoinColumns = {@JoinColumn(name = "authority_name", referencedColumnName = "name")})
       @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
       private Set<Authority> authorities = new HashSet<>(); 
    
       // omitted setter & getters
    }
    
  2. 管理局

    @Entity
    @Table(name = "jhi_authority")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    public class Authority implements Serializable {
    
        @NotNull
        @Size(min = 0, max = 50)
        @Id
        @Column(length = 50)
        private String name;
    
       // omitted setter & getters
    }
    

    相应的Dao图层

     public interface UserRepository extends JpaRepository<User, Long> {                                              
    
         // omitted other CRUD methods
    
         Optional<User> findOneByLogin(String login);
    }
    

    和服务层

    @Service
    @Transactional
    public class UserService {
    
        @Inject
        private UserRepository userRepository;
    
        @Transactional(readOnly = true)
        public User getUserWithAuthorities() {
            User user = userRepository.findOneByLogin(SecurityUtils.getCurrentLogin()).get();
            user.getAuthorities().size(); // eagerly load the association
            return user;
        }
    
        // omitted other service methods
    }
    
  3. 当Controller调用服务的 getUserWithAuthorities()并且发现用户时,必须使用未初始化的权限字段,那么

    user.getAuthorities().size(); // eagerly load the association
    

    可以加载它们(Hibernate是jhipster在这里使用的JPA提供程序,它默认为实体中的惰性集合关联)。但是在调试器中,我总是在 user.getAuthorities()。size()调用之前看到初始化的权限。 我尝试从服务方法中删除 @Transactional ,但随后发生了 LazyInitializationException ,这就是jhipster手册建议在服务层使用它的原因。另外,我尝试在User的权限字段上明确地放置(fetch = FetchType.LAZY)。 我不认为当局在服务或dao层的其他地方进行了预取(我到处都有断点, getUserWithAuthorities()是第一个被调用的方法)。有人可以对此有所了解吗?

0 个答案:

没有答案