Relacje OneToMany/ManyToOne i LazyInitializationException

0

Cześć
Mam za zadanie uruchomić projekt z Spring, Spring Data JPA i Hibernatem na czele na encjach (i muszę go użyć w projekcie), które wcześniej były używane w poprzednim projekcie z Eclipselinkiem. Encje są pozbawione adnotacji Eclipselinkowych, trochę je dostosowałem do Hibernate (np. double precision było na float w kodzie zamiast na double), lecz utknąłem na jednej rzeczy. Wszystkie relacje OneToMany/ManyToOne w każdej encji zwracają wyjątek "LazyInitializationException". Patrzyłem na adnotacje OneToMany/ManyToOne i wyglądają prawilnie. Nie będę teraz każdej encji wstawiał, wstawie tylko kod konfiguracyjny, natomiast zastanawia mnie co może być przyczyną? A może ten wyjątek tak naprawdę czegoś innego dotyczy? Oczywiście na Eclipselinku wszystko działa prawidłowo, a ja już straciłem pomysły co może być nie halo.

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "FactoryPostgres",
        basePackages = {"com.project.screen.repository"}
)
public class ConfigurationDataSource {


    @Autowired
    ScreenProperties screenProperties;

    @Bean(name = "dataSourcePostgres")
    public DataSource dataSourcePostgres() {

        final BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(screenProperties.getDatasourceClassnameDriver());
        dataSource.setUrl(screenProperties.getDatasourceUrl());
        dataSource.setUsername(screenProperties.getDatasourceUsername());
        dataSource.setPassword(screenProperties.getDatasourcePassword());

        return dataSource;
    }

    @Bean(name = "defaultDataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    @Primary
    public DataSource defaultDataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "FactoryPostgres")
    @PersistenceContext(unitName = "postgres")
    public LocalContainerEntityManagerFactoryBean
    entityManagerFactory(

    ) {
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean =
                new LocalContainerEntityManagerFactoryBean();
        localContainerEntityManagerFactoryBean.setDataSource(dataSourcePostgres());
        localContainerEntityManagerFactoryBean.setPackagesToScan(new String[]{"com.project.model"});

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(vendorAdapter);
        localContainerEntityManagerFactoryBean.setJpaProperties(additionalProperties());


        return localContainerEntityManagerFactoryBean;
    }

    @Bean(name = "transactionManager")
    @PersistenceContext(unitName = "postgresT")
    public PlatformTransactionManager transactionManager(
            @Qualifier("FactoryPostgres") EntityManagerFactory
                    entityManagerFactory
    ) {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

        return jpaTransactionManager;
    }

    Properties additionalProperties() {

        Properties properties = new Properties();
        properties.setProperty("hibernate.hbm2ddl.auto", "validate");
        properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
        properties.setProperty("hibernate.current_session_context_class", "thread");
        properties.setProperty("hibernate.show_sql", "true");
        properties.setProperty("hibernate.physical_naming_strategy","com.project.config.ConfigurationPhysicalNameStrategy");
        return properties;
    }
0

Pokaż encje i przykład pobierania danych.

1

Dociagasz dane w jakiejs transakcji? Jak hibernate nie ma traksacji w ktorej moze dociagnac dane to wyleci typ wyjatkiem. Jest do tego jeszcze jakis statyczny hak cos w desen Hibernate.initializeCollection() ale polceam pierwsza opcje

0

Rozwiązałem problem: okazało się, że w niektórych relacjach zostało pominięte @OneToMany, a było tylko @ManyToOne. Teraz już jest okej.

1 użytkowników online, w tym zalogowanych: 0, gości: 1