我对 Spring-data-jpa 项目有疑问。
Java配置文件
...
@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,无法初始化代理 - 无 session org.hibernate.LazyInitializationException:延迟初始化角色集合失败:it.myproject.data.person.Person.books,无法初始化代理 - 无 session
你能帮帮我吗? 谢谢
最佳答案
已解决。我从配置中删除了“(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")
关于java - Spring 数据 jpa LazyInitializationException : no Session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22960268/