java - 关于Spring的CrudRepository返回Entity的问题
本文介绍了java - 关于Spring的CrudRepository返回Entity的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
各位高手,我在使用hibernate、jpa、springdata集成时遇到了如下的问题:
1.model
@Entity
@Table(name="group",schema="sc")
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Group extends AbstractEntity
{
...
@ElementCollection(fetch= FetchType.EAGER)
@NotNull
@Column(name="user")
@CollectionTable(name = "t_group_users", schema = "sc", joinColumns = @JoinColumn(name = "group_id"))
private List<String> users;
}
2.repository
public interface GroupRepository extends CrudRepository<Group, UUID>
{
}
3.config
@Configuration
@EnableJpaRepositories(basePackages = { "com.**.**" })
public class RepositoryTestConfig
{
@Bean
public PlatformTransactionManager transactionManager(EntityManagerFactory emf)
{
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource)
{
LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
emfb.setDataSource(dataSource());
emfb.setJpaVendorAdapter(jpaVendorAdapter());
emfb.setPackagesToScan("com.**.**.model");
Properties properties = new Properties();
properties.setProperty("hibernate.hbm2ddl.auto", "create");
properties.setProperty("hibernate.format_sql", "true");
emfb.setJpaProperties(properties);
return emfb;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter()
{
HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.H2);
adapter.setShowSql(false);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.H2Dialect");
return adapter;
}
@Bean(name = "testFunctionDataSource")
public DataSource dataSource()
{
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:~/test;INIT=CREATE SCHEMA IF NOT EXISTS sc");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
}
但我使用groupRepository.findOne
方法时,users
返回的是org.hibernate.collection.internal.PersistentBag
类型,而不是ArrayList
类型,请问是什么原因?
解决方案
这个PersistentBag也是List的一种实现。Hibernate为啥不直接用ArrayList呢,因为它要支持懒加载,所以需要在类似ArrayList实现的基础上再包装一层。比如你调用List的get、size之类的方法,如果是懒加载,这个PersistentBag会先去把数据从数据库里面读进来,再做操作。如果是Eager的(就像你的代码设置的),那么就和一般的ArrayList没啥区别了。
对于用户来说,是没什么感受的,你就把他当List用就好。
这篇关于java - 关于Spring的CrudRepository返回Entity的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文