use*_*743 7 java spring hibernate jpa spring-data-jpa
我有一个Spring-data-jpa项目的问题.
JavaConfig文件
...
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
为了测试一切正常,我创建了这个方法
@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());
});
}
Run Code Online (Sandbox Code Playgroud)
我的实体是:
@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;
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息:
2014-04-09 12:31:54 TRACE LazyInitializationException:53 - 懒得初始化一个角色集合:it.myproject.data.person.Person.books,无法初始化代理 - 没有Session org.hibernate.LazyInitializationException:failed懒惰地初始化一个角色集合:it.myproject.data.person.Person.books,无法初始化代理 - 没有会话
你能帮助我吗?谢谢
看起来这@Transactional
不起作用,就像repositoryPersonService.findAll()
返回分离实体的集合一样。然后,当尝试循环这些实体并访问延迟初始化的集合时,我们遇到了LazyInitializationException
.
要确认这一点,请尝试在调用的方法中放置一个断点findAll
,并查看事务方面是否正在应用。
要应用于@Transactional
测试方法,请查看它是由组件扫描捕获的 Spring bean(使用ComponentScan("some.package")
注释)。
归档时间: |
|
查看次数: |
8856 次 |
最近记录: |