我正在使用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;
...
}
答案 0 :(得分:0)
我猜你没有激活交易管理。
添加
<tx:annotation-driven/>
到你的配置文件。