关于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;

    }


 

但我使用groupRepository.findOne方法时,users返回的是org.hibernate.collection.internal.PersistentBag类型,而不是ArrayList类型,请问是什么原因?


函数式编程
浏览 591回答 1
1回答

守候你守候我

这个PersistentBag也是List的一种实现。Hibernate为啥不直接用ArrayList呢,因为它要支持懒加载,所以需要在类似ArrayList实现的基础上再包装一层。比如你调用List的get、size之类的方法,如果是懒加载,这个PersistentBag会先去把数据从数据库里面读进来,再做操作。如果是Eager的(就像你的代码设置的),那么就和一般的ArrayList没啥区别了。对于用户来说,是没什么感受的,你就把他当List用就好。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java