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

Spring JPA和LazyInitializationException

归誉
2023-03-14

我正在使用Spring-JPA。我有两个测试。

@Test
@Transactional
public void testFindAll() {
    List<Engine> eList = engineService.findAll();
    Engine e = eList.get(0); //this engine id=3
    List<Translation> tList = e.getTranslations();
    for(Translation t : tList) {
        ...
    }
}

此方法失败,出现以下异常:

@Test
@Transactional
public void testFindOne() {
    Engine e = engineService.findOne(3);
    List<Translation> tList = e.getTranslations();
    for(Translation t : tList) {
        ...
    }
}
public interface EngineRepository extends JpaRepository<Engine, Integer>
{   
}
@Service
@Transactional
public class EngineService
{
    @Autowired
    private EngineRepository engineRepository;

    public List<Engine> findAll()
    {
        return engineRepository.findAll();
    }

    public Engine findOne(Integer engId)
    {
        return engineRepository.findOne(engId);
    }
}
public class Engine implements Serializable {
    ...
    @OneToMany
    @JoinColumn(name="ID", referencedColumnName="TRAN_ID",  insertable=false, updatable=false, nullable=true)
    @LazyCollection(LazyCollectionOption.EXTRA)
    private List<Translation> translations;
    ...
}

配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = {"xxx.dao"})
@ComponentScan(basePackages = {"xxx.dao", "xxx.service", "xxx.bean"})
@PropertySource("classpath:application.properties")
public class SpringDataConfig {

  @Autowired
  private Environment environment;

  @Bean
  public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setUrl(environment.getProperty("db.url"));
    dataSource.setDriverClassName(environment.getProperty("db.driverClass"));
    dataSource.setUsername(environment.getProperty("db.username"));
    dataSource.setPassword(environment.getProperty("db.password"));
    return dataSource;
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws NamingException {
    HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
    hibernateJpaVendorAdapter.setDatabase(Database.POSTGRESQL);

    Properties properties = new Properties();


    properties.put("hibernate.dialect", environment.getProperty("hibernate.dialect"));
    properties.put("hibernate.show_sql", environment.getProperty("hibernate.showSQL"));
    properties.put("hibernate.format_sql", environment.getProperty("hibernate.formatSQL"));

    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactoryBean.setDataSource(dataSource());
    entityManagerFactoryBean.setPackagesToScan("xxx.model");
    entityManagerFactoryBean.setJpaVendorAdapter(hibernateJpaVendorAdapter);
    entityManagerFactoryBean.setJpaProperties(properties);

    return entityManagerFactoryBean;
  }

  @Bean
  public JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);

    return transactionManager;
  }
}

共有1个答案

陶博耘
2023-03-14

我认为这里的问题是,在第一种情况下,会话在第一行之后关闭。您应该查看findAll()的JPararePository实现。

 类似资料:
  • 我开始制作一个简单的spring boot应用程序。 我的第一步是利用Spring JDBC支持,使用默认的H2内存数据库。对于示例数据,我在src/main/resources中有schema.sql和data.sql。 所以当spring启动时,它也会执行这两个脚本并填充H2数据库,我可以通过H2控制台访问它。

  • 我仍然是java和spring的初学者,我已经在mysql中存储了一个名为< code>Offers的表,我试图逐行获取数据< code >其中Status == 0,我的表看起来像这样: 当我尝试运行我的代码时,它的返回 org.springframework.beans.factory。BeanCreationException:创建在类路径资源[org/springframework/boo

  • 我正在开发一个spring批处理应用程序(内存为2GB),尝试处理数据(在处理过程中使用select查询获取数据),并在postgres DB中插入大约100万条处理过的记录。我在这个项目中使用Spring Data JPA。但是Spring JPA在处理这些记录时消耗了太多内存

  • 我试图构建一个基于wicket、Spring jpa存储库和MySQL的应用程序。 问题是,我的Service类只是不想自动配线。如果我想使用自动配线的类,我有一个空指针异常。 事实上,我得到了双空指针:我的BaseServiceConfig。java不会自动连接实现,itnerface中的自动连接存储库也为空。所以,问题是为什么。 我试图用最少甚至没有xml的方式实现这一点,所有的配置都是在ja

  • 我正在使用Spring MVC/Security/JPA/Hibernate开发一个web应用程序。 我有一个用户类,它与UserRole有一个omany关系。 UserRole类与用户之间有很多关系。 用户存储库界面非常简单。 当我使用下面的代码片段使用存储库加载用户信息时,它会很好地检索用户和用户角色数据。 这是日志文件。 然而,问题出在这里。 如果我使用UserRepository的save

  • 在我的Spring Boot应用程序中有POJO,下面是它的样子: 现在我想选择所有与给定值相关的方式是POJO的成员。 所以这是我的查询

  • 我试图写这个来获取列表,我必须将ID列表作为参数传递: 我的实体是我用来查询的实体是: 但我在运行后遇到了以下异常: 有人能帮我用上面的方法获取列表吗?或者能告诉我我在这方面做错了什么。我不想使用本机,即(nativeQuery=true)使用这个。

  • 我在删除联接表中引用的实体时遇到问题。以下是三个链接的enitie。 当我尝试使用CrudRepository从来宾表中删除来宾时,它会给我这个错误。 错误:表“guest”上的更新或删除违反了表“guest\u group\u join”上的外键约束“FKKOUGVMCU860MOUACR1SHJXY”。键(id)=(4)仍然从表“guest\u group\u join”中引用。 有人能帮忙吗