当前位置: 首页 > 知识库问答 >
问题:

JPA LazyInitialisationException-无法初始化代理

仲高超
2023-03-14

是的,我见过类似的问题,但没有一个答案能真正引导我找到解决方案。我没有在任何地方使用这个线程,同样的代码在另一个jhipster应用程序中也可以使用,所以我不明白为什么这个提升转换会导致Hibernate问题。

public UserDetailsContextMapper userDetailsContextMapper() {
    return new UserDetailsContextMapper() {
        @Override
        public UserDetails mapUserFromContext(
            DirContextOperations ctx, String username,
            Collection<? extends GrantedAuthority> authorities) {
            log.error("2 " + username + " -> " + ctx.toString());
            String lowercaseLogonName = username.toLowerCase();
            Optional<User> userFromDatabase = userRepository.findOneByLogin(lowercaseLogonName);
            if (!userFromDatabase.isPresent()) {
                User ldapUser = new User();
                ldapUser.setLogin(lowercaseLogonName);
                ldapUser.setPassword(RandomStringUtils.random(60)); // We use LDAP password, but the password need to be set
                ldapUser.setActivated(true);
                try {
                    Attribute attribute = ctx.getAttributes().get("mail");
                    ldapUser.setEmail( attribute != null && attribute.size() > 0 ? (String) attribute.get(0) : "");
                    attribute = ctx.getAttributes().get("givenname");
                    ldapUser.setFirstName(attribute != null && attribute.size() > 0 ? (String) attribute.get(0) : "");
                    attribute = ctx.getAttributes().get("sn");
                    ldapUser.setLastName(attribute != null && attribute.size() > 0 ? (String) attribute.get(0) : "");
                } catch (NamingException e) {
                    log.warn("Couldn't get LDAP details for user: " + lowercaseLogonName);
                }

                Set<Authority> newUserAuthorities = new HashSet<>();
                Authority authority = authorityRepository.getOne(AuthoritiesConstants.USER);

                newUserAuthorities.add(authority); <-- This line in the Exception

                ldapUser.setAuthorities(newUserAuthorities);
                ldapUser.setLangKey("en");
                userRepository.saveAndFlush(ldapUser);

            }

例外:

org.hibernate.LazyInitializationException: could not initialize proxy [com.app.my.let.domain.Authority#ROLE_USER] - no Session
        at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:155)
        at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:268)
        at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:73)
        at com.app.my.let.domain.Authority_$$_jvst758_1e.hashCode(Authority_$$_jvst758_1e.java)
        at java.util.HashMap.hash(HashMap.java:339)
        at java.util.HashMap.put(HashMap.java:612)
        at java.util.HashSet.add(HashSet.java:220)
        at com.app.my.let.config.SecurityConfiguration$1.mapUserFromContext(SecurityConfiguration.java:249) <-- code line above

JPA地产:

jpa:
        database-platform: org.hibernate.dialect.SQLServer2012Dialect
        database: SQL_SERVER
        show_sql: true
        format_sql: true
        properties:
            hibernate.id.new_generator_mappings: true
            hibernate.cache.use_second_level_cache: false
            hibernate.cache.use_query_cache: false
            hibernate.generate_statistics: true

编辑-这解决了我的问题:

Optional<Authority> optAuthority = authorityRepository.findById(AuthoritiesConstants.USER);

Authority authority = optAuthority.get();

共有1个答案

邴姚石
2023-03-14

这一行:

Authority authority = authorityRepository.getOne(AuthoritiesConstants.USER);

只提供对实体的引用。在引擎盖下,它调用EntityManager\getReference。作为SAI,这不是实体,只是用于对象关系映射目的的引用。异常被抛出,因为您试图在事务环境之外强制转换它。

有两种解决方案。要获取实体,您必须使用EntityManager#find或在事务中执行(在方法上使用@Transactional)。在这里,您还可以调用Hibernate。初始化(权限)从数据库中获取实体。

 类似资料:
  • 我有一个LazyInitializationException问题,我不知道如何解决它。 之前的问题是我打电话的时候。getperson=null,但我修复了findProjectEmployeesWithinDates请求获取此人的调用。但当我调用“findProjectEmployeesWithinDates”时,我遇到了一个例外。查找项目员工的代码包括: 所以用debbug我看到: 它位于f

  • 我正在构建一个使用并返回JSON的RESTful Web服务。当我试图通过服务层从数据库中获取ESBRATING对象时,遇到以下堆栈跟踪。然而,当我将Spring数据JPA存储库直接注入控制器并使用它来获取ESRBRating by ID时,它工作得很好。但是,当通过服务层调用时,它不起作用。我在下面提供了堆栈跟踪和代码。有人能向我解释一下为什么在通过服务层时会发生这种情况,而在直接通过Sprin

  • 我使用< code>spring-data-jpa与< code > spring-boot(v 2 . 0 . 0 . release),我刚刚在MySQL上写了一个CRUD演示,但是在运行时出现异常,源代码如下: 源码 User.java UserRepository.java 用户服务测试.java 应用程序.yml 例外详细信息 我尝试另一种方法,它可以成功运行。

  • 我有一个应用程序,我正在扩展它以提供REST API。在主站点中一切正常,但当我尝试访问REST API时,我在异常日志中得到以下内容: 禁用延迟加载将解决此问题,但会导致不可接受的性能(加载时间从 200 毫秒到 22 秒)。我不知道如何处理这个问题。 我刚开始在ColdFusion中Rest,在我看来,CFC正在以一种不寻常的方式被处理。它们似乎没有被初始化(init方法似乎没有运行),现在看

  • 我正在从事一个名为“Cloudnet-v3”的开源项目。我正在使用本地机器上的符号链接/数据连接到IntelliJProjects文件夹中的数据点。 我收到了以下启动命令: 我当前的工作目录是: 因此,每当我在workdir中执行给定命令时,它都会失败,并出现以下错误:完整日志 现在我想知道,因为它在自动环境中工作,但主分支源没有变化,例如,到/data/launcher而不是launcher的路

  • 我目前正在尝试首次在Eclipse中使用调试器,并收到以下错误: 错误消息的图像 我无法使用调试器并导致此错误的原因是什么? 确保javaagent-shaded.jar文件存在 确保路径正确 尝试用sudo启动Eclipse 确保Eclipse可以访问上述路径 在