各位高手,我在使用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 ini juga merupakan pelaksanaan List. Mengapa Hibernate tidak menggunakan ArrayList secara langsung Kerana ia perlu menyokong pemuatan malas, ia perlu dibalut dengan lapisan lain berdasarkan pelaksanaan ArrayList yang serupa. Sebagai contoh, jika anda memanggil kaedah seperti dapatkan dan saiz Senarai, jika ia malas memuatkan, PersistentBag akan membaca data daripada pangkalan data dan kemudian melakukan operasi. Jika ia adalah Eager (seperti yang ditetapkan oleh kod anda), maka ia tidak berbeza daripada ArrayList biasa.
Untuk pengguna, tidak ada perasaan Anda hanya boleh menggunakannya sebagai Senarai.