java - 关于Spring的CrudRepository返回Entity的问题
大家讲道理
大家讲道理 2017-04-18 09:51:04
0
1
459

各位高手,我在使用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类型,请问是什么原因?

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

répondre à tous(1)
巴扎黑

Ce PersistentBag est également une implémentation de List. Pourquoi Hibernate n'utilise-t-il pas directement ArrayList ? Parce qu'il doit prendre en charge le chargement paresseux, il doit être encapsulé avec une autre couche basée sur une implémentation ArrayList similaire. Par exemple, si vous appelez des méthodes telles que get et size of List, s'il s'agit d'un chargement paresseux, PersistentBag lira d'abord les données de la base de données, puis effectuera des opérations. S'il s'agit d'Eager (tel que défini par votre code), alors ce n'est pas différent d'une ArrayList normale.

Pour l'utilisateur, il n'y a aucune sensation. Vous pouvez simplement l'utiliser comme liste.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal