又好旧的LazyInitializationException

时间:2014-12-05 10:26:51

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

我正在使用Spring Data JPA和嵌入式HSQL。我在使用@Transactional注释的方法中有一个LazyInitializationException。我查了很多论坛,但无法找到答案。所以代码:

@Service
public class RepositoryServiceEntityService implements IServiceEntityService {

    private static final Logger LOGGER = LoggerFactory.getLogger(RepositoryServiceEntityService.class);

    @Resource
    private ServiceEntityRepository serviceEntityRepository;
    @Autowired
    private Converter converter;

    @Transactional
    public List<ServiceDTO> getServices() throws JsonParseException, JsonMappingException, IOException {
        LOGGER.debug("Getting the service list from DB");
        List<ServiceDTO> serviceDTOs = new ArrayList<ServiceDTO>();
        try {
            // getting the service entities
            List<ServiceEntity> serviceEntities = serviceEntityRepository.findAll();
            // converting them to ServiceDTOs
            for(ServiceEntity serviceEntity : serviceEntities) {
                serviceEntity.getEndpoints().size();
                serviceDTOs.add(converter.convertToServiceDTO(serviceEntity));
            }
            return serviceDTOs;
        } finally {
            LOGGER.debug("Retrieved {} services from DB", serviceDTOs.size());
        }
    }
}

配置:

<beans ...>

    <context:component-scan base-package="org.protneut.server.management.persistence.service" />

    <!-- **************** for JPA **************** -->
    <jpa:repositories base-package="org.protneut.server.management.persistence.repository"/>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean> 

    <jdbc:embedded-database id="hsqlDataSource" type="HSQL">
        <jdbc:script location="classpath:schema.sql" encoding="UTF-8" />
        <jdbc:script location="classpath:data.sql" encoding="UTF-8" />
    </jdbc:embedded-database>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="hsqlDataSource" />
        <property name="persistenceUnitName" value="hsql" />
        <property name="packagesToScan" value="org.protneut.server.management.persistence.model" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
            </bean>
        </property>
    </bean>

    ...
</beans>

尝试在getEndpoints()上调用size()时,我在RepositoryServiceEntityService中有以下异常:

org.hibernate.LazyInitializationException:懒得初始化一个角色集合:org.protneut.server.management.persistence.model.ServiceEntity.endpoints,无法初始化代理 - 没有会话

可能我不参加会议?我假设我在配置上犯了一个错误但不确定是什么。

有人可以帮忙吗?

谢谢,V。

************************更新********************** **

添加实体类

@Entity
@Table(name = "SERVICE")
public class ServiceEntity implements Serializable {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private long id;

    ...

    @OneToMany(fetch = FetchType.LAZY, targetEntity=EndpointEntity.class, mappedBy="serviceEntity")
    private List<EndpointEntity> endpoints;

    ...

}


@Entity
@Table(name = "ENDPOINT")
public class EndpointEntity implements Serializable {

    ...

    @ManyToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="SERVICE_ID")
    private ServiceEntity serviceEntity;

    ...

}

1 个答案:

答案 0 :(得分:0)

我猜你没有激活交易管理。

添加

<tx:annotation-driven/>

到你的配置文件。