【问题标题】:Spring-data-jpa LazyInitializationException: no SessionSpring-data-jpa LazyInitializationException:没有会话
【发布时间】:2014-05-22 12:29:35
【问题描述】:

我的 Spring-data-jpa 项目有问题。

JavaConfig 文件

...

@Configuration
@EnableJpaRepositories("it.myproject.data")
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@PropertySource("classpath:/it/myproject/application.properties")
public
        class DBConfig
{

    private static final
            String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN = "entitymanager.packages.to.scan";
    @Resource
    private
            Environment environment;

    @Bean
    public
            DataSource dataSource()
    {
        EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
        return builder.setType(EmbeddedDatabaseType.H2).build();
    }

    @Bean
    public
            EntityManagerFactory entityManagerFactory()
    {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);
        vendorAdapter.setShowSql(true);
        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan(environment.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
        factory.setDataSource(dataSource());
        factory.afterPropertiesSet();
        return factory.getObject();
    }

    @Bean
    public
            PlatformTransactionManager transactionManager()
    {
        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }
}

为了测试一切正常,我创建了这个方法

@Transactional
    public
            void doIt()
    {
        PersonDTO created = new PersonDTO();
        created.setId(null);
        created.setFirstName("Pluto");
        created.setLastName("Paperino");
        Person pippo= repositoryPersonService.create(created);
        for (int i = 0; i < 10; i++) {
            BookDTO bookDTO = new BookDTO();
            bookDTO.setTitle("Fantasia" + i);
            bookDTO.setPerson(pippo);
            repositoryBookService.create(bookDTO);
        }
        repositoryPersonService.findAll().stream().forEach((Person t) -> {
            System.out.println(t.getBooks());
        });
    }

我的实体是:

@Entity
@Table(name = "persons")
public
        class Person
        implements Serializable
{

    private static final
            long serialVersionUID = 198765467898765L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private
            Long id;
    @Column(name = "creation_time", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private
            Date creationTime;
    @Column(name = "first_name", nullable = false)
    private
            String firstName;
    @Column(name = "last_name", nullable = false)
    private
            String lastName;
    @Column(name = "modification_time", nullable = false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private
            Date modificationTime;
    @OneToMany(fetch = FetchType.LAZY)
    private
            List<Book> books;
    @Version
    private
            long version = 0;

但是我收到了这个错误信息:

2014-04-09 12:31:54 TRACE LazyInitializationException:53 - 未能延迟初始化角色集合:it.myproject.data.person.Person.books,无法初始化代理 - 无会话 org.hibernate.LazyInitializationException:无法延迟初始化角色集合:it.myproject.data.person.Person.books,无法初始化代理 - 没有会话

你能帮帮我吗? 谢谢

【问题讨论】:

  • 如果你只是正常地遍历repositoryPersonService.findAll()(即不使用流),你会遇到同样的问题吗?

标签: java spring hibernate jpa spring-data-jpa


【解决方案1】:

解决了。我从配置中删除了“(mode = AdviceMode.ASPECTJ,proxyTargetClass = true)”,现在它工作正常。谢谢大家!

之前->

@Configuration
@EnableJpaRepositories("it.myproject.data")
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true)
@PropertySource("classpath:/it/myproject/application.properties")

现在 ->

@Configuration
@EnableJpaRepositories("it.myproject.data")
@EnableTransactionManagement
@PropertySource("classpath:/it/myproject/application.properties")

【讨论】:

    【解决方案2】:

    @Transactional 似乎不起作用,因为repositoryPersonService.findAll() 正在返回一个分离实体的集合。然后,当尝试遍历这些实体并访问惰性初始化集合时,我们遇到了LazyInitializationException

    要确认这一点,请尝试在调用 findAll 的方法中放置一个断点,并查看是否正在应用事务方面。

    要将@Transactional 应用于测试方法,请查看它是由组件扫描捕获的Spring bean(使用ComponentScan("some.package") 注释)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-26
      • 1970-01-01
      • 2018-08-11
      • 2014-12-17
      • 2016-08-27
      • 2015-07-31
      • 2014-07-21
      相关资源
      最近更新 更多