好的,我最近一直在用新生成的项目调查jhipster。在调试身份验证过程(基于令牌)的过程中,我了解到我并没有明确地获得 @Transactional 原则和实体中的延迟关联加载。所以jhipster生成了这样的2个实体,DAO和服务层: (原始代码,我没有改变任何内容)
用户
@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
}
管理局
@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
}
当Controller调用服务的 getUserWithAuthorities()并且发现用户时,必须使用未初始化的权限字段,那么
user.getAuthorities().size(); // eagerly load the association
可以加载它们(Hibernate是jhipster在这里使用的JPA提供程序,它默认为实体中的惰性集合关联)。但是在调试器中,我总是在 user.getAuthorities()。size()调用之前看到初始化的权限。 我尝试从服务方法中删除 @Transactional ,但随后发生了 LazyInitializationException ,这就是jhipster手册建议在服务层使用它的原因。另外,我尝试在User的权限字段上明确地放置(fetch = FetchType.LAZY)。 我不认为当局在服务或dao层的其他地方进行了预取(我到处都有断点, getUserWithAuthorities()是第一个被调用的方法)。有人可以对此有所了解吗?