diff --git a/org.springframework.orm/src/main/java/org/springframework/orm/hibernate4/LocalSessionFactoryBean.java b/org.springframework.orm/src/main/java/org/springframework/orm/hibernate4/LocalSessionFactoryBean.java index ca1265ce926..5af9396b3d1 100644 --- a/org.springframework.orm/src/main/java/org/springframework/orm/hibernate4/LocalSessionFactoryBean.java +++ b/org.springframework.orm/src/main/java/org/springframework/orm/hibernate4/LocalSessionFactoryBean.java @@ -1,335 +1,352 @@ -/* - * Copyright 2002-2011 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.orm.hibernate4; - -import java.io.File; -import java.io.IOException; -import java.util.Properties; -import javax.sql.DataSource; - -import org.hibernate.SessionFactory; -import org.hibernate.cfg.NamingStrategy; - -import org.springframework.beans.factory.DisposableBean; -import org.springframework.beans.factory.FactoryBean; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.ResourceLoaderAware; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternUtils; - -/** - * {@link org.springframework.beans.factory.FactoryBean} that creates a - * Hibernate {@link org.hibernate.SessionFactory}. This is the usual way to - * set up a shared Hibernate SessionFactory in a Spring application context; - * the SessionFactory can then be passed to Hibernate-based DAOs via - * dependency injection. - * - *
NOTE: This variant of LocalSessionFactoryBean requires Hibernate 4.0
- * or higher. It is similar in role to the same-named class in the If this is set, the Hibernate settings should not define
- * a connection provider to avoid meaningless double configuration.
- */
- public void setDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- }
-
- /**
- * Set the location of a single Hibernate XML config file, for example as
- * classpath resource "classpath:hibernate.cfg.xml".
- * Note: Can be omitted when all necessary properties and mapping
- * resources are specified locally via this bean.
- * @see org.hibernate.cfg.Configuration#configure(java.net.URL)
- */
- public void setConfigLocation(Resource configLocation) {
- this.configLocations = new Resource[] {configLocation};
- }
-
- /**
- * Set the locations of multiple Hibernate XML config files, for example as
- * classpath resources "classpath:hibernate.cfg.xml,classpath:extension.cfg.xml".
- * Note: Can be omitted when all necessary properties and mapping
- * resources are specified locally via this bean.
- * @see org.hibernate.cfg.Configuration#configure(java.net.URL)
- */
- public void setConfigLocations(Resource[] configLocations) {
- this.configLocations = configLocations;
- }
-
- /**
- * Set Hibernate mapping resources to be found in the class path,
- * like "example.hbm.xml" or "mypackage/example.hbm.xml".
- * Analogous to mapping entries in a Hibernate XML config file.
- * Alternative to the more generic setMappingLocations method.
- * Can be used to add to mappings from a Hibernate XML config file,
- * or to specify all mappings locally.
- * @see #setMappingLocations
- * @see org.hibernate.cfg.Configuration#addResource
- */
- public void setMappingResources(String[] mappingResources) {
- this.mappingResources = mappingResources;
- }
-
- /**
- * Set locations of Hibernate mapping files, for example as classpath
- * resource "classpath:example.hbm.xml". Supports any resource location
- * via Spring's resource abstraction, for example relative paths like
- * "WEB-INF/mappings/example.hbm.xml" when running in an application context.
- * Can be used to add to mappings from a Hibernate XML config file,
- * or to specify all mappings locally.
- * @see org.hibernate.cfg.Configuration#addInputStream
- */
- public void setMappingLocations(Resource[] mappingLocations) {
- this.mappingLocations = mappingLocations;
- }
-
- /**
- * Set locations of cacheable Hibernate mapping files, for example as web app
- * resource "/WEB-INF/mapping/example.hbm.xml". Supports any resource location
- * via Spring's resource abstraction, as long as the resource can be resolved
- * in the file system.
- * Can be used to add to mappings from a Hibernate XML config file,
- * or to specify all mappings locally.
- * @see org.hibernate.cfg.Configuration#addCacheableFile(java.io.File)
- */
- public void setCacheableMappingLocations(Resource[] cacheableMappingLocations) {
- this.cacheableMappingLocations = cacheableMappingLocations;
- }
-
- /**
- * Set locations of jar files that contain Hibernate mapping resources,
- * like "WEB-INF/lib/example.hbm.jar".
- * Can be used to add to mappings from a Hibernate XML config file,
- * or to specify all mappings locally.
- * @see org.hibernate.cfg.Configuration#addJar(java.io.File)
- */
- public void setMappingJarLocations(Resource[] mappingJarLocations) {
- this.mappingJarLocations = mappingJarLocations;
- }
-
- /**
- * Set locations of directories that contain Hibernate mapping resources,
- * like "WEB-INF/mappings".
- * Can be used to add to mappings from a Hibernate XML config file,
- * or to specify all mappings locally.
- * @see org.hibernate.cfg.Configuration#addDirectory(java.io.File)
- */
- public void setMappingDirectoryLocations(Resource[] mappingDirectoryLocations) {
- this.mappingDirectoryLocations = mappingDirectoryLocations;
- }
-
- /**
- * Set a Hibernate NamingStrategy for the SessionFactory, determining the
- * physical column and table names given the info in the mapping document.
- * @see org.hibernate.cfg.Configuration#setNamingStrategy
- */
- public void setNamingStrategy(NamingStrategy namingStrategy) {
- this.namingStrategy = namingStrategy;
- }
-
- /**
- * Set Hibernate properties, such as "hibernate.dialect".
- * Note: Do not specify a transaction provider here when using
- * Spring-driven transactions. It is also advisable to omit connection
- * provider settings and use a Spring-set DataSource instead.
- * @see #setDataSource
- */
- public void setHibernateProperties(Properties hibernateProperties) {
- this.hibernateProperties = hibernateProperties;
- }
-
- /**
- * Return the Hibernate properties, if any. Mainly available for
- * configuration through property paths that specify individual keys.
- */
- public Properties getHibernateProperties() {
- if (this.hibernateProperties == null) {
- this.hibernateProperties = new Properties();
- }
- return this.hibernateProperties;
- }
-
- /**
- * Specify annotated entity classes to register with this Hibernate SessionFactory.
- * @see org.hibernate.cfg.Configuration#addAnnotatedClass(String)
- */
- public void setAnnotatedClasses(Class>[] annotatedClasses) {
- this.annotatedClasses = annotatedClasses;
- }
-
- /**
- * Specify the names of annotated packages, for which package-level
- * annotation metadata will be read.
- * @see org.hibernate.cfg.Configuration#addPackage(String)
- */
- public void setAnnotatedPackages(String[] annotatedPackages) {
- this.annotatedPackages = annotatedPackages;
- }
-
- /**
- * Specify packages to search for autodetection of your entity classes in the
- * classpath. This is analogous to Spring's component-scan feature
- * ({@link org.springframework.context.annotation.ClassPathBeanDefinitionScanner}).
- */
- public void setPackagesToScan(String... packagesToScan) {
- this.packagesToScan = packagesToScan;
- }
-
- public void setResourceLoader(ResourceLoader resourceLoader) {
- this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
- }
-
-
- public void afterPropertiesSet() throws IOException {
- LocalSessionFactoryBuilder sfb = new LocalSessionFactoryBuilder(this.dataSource, this.resourcePatternResolver);
-
- if (this.configLocations != null) {
- for (Resource resource : this.configLocations) {
- // Load Hibernate configuration from given location.
- sfb.configure(resource.getURL());
- }
- }
-
- if (this.mappingResources != null) {
- // Register given Hibernate mapping definitions, contained in resource files.
- for (String mapping : this.mappingResources) {
- Resource mr = new ClassPathResource(mapping.trim(), this.resourcePatternResolver.getClassLoader());
- sfb.addInputStream(mr.getInputStream());
- }
- }
-
- if (this.mappingLocations != null) {
- // Register given Hibernate mapping definitions, contained in resource files.
- for (Resource resource : this.mappingLocations) {
- sfb.addInputStream(resource.getInputStream());
- }
- }
-
- if (this.cacheableMappingLocations != null) {
- // Register given cacheable Hibernate mapping definitions, read from the file system.
- for (Resource resource : this.cacheableMappingLocations) {
- sfb.addCacheableFile(resource.getFile());
- }
- }
-
- if (this.mappingJarLocations != null) {
- // Register given Hibernate mapping definitions, contained in jar files.
- for (Resource resource : this.mappingJarLocations) {
- sfb.addJar(resource.getFile());
- }
- }
-
- if (this.mappingDirectoryLocations != null) {
- // Register all Hibernate mapping definitions in the given directories.
- for (Resource resource : this.mappingDirectoryLocations) {
- File file = resource.getFile();
- if (!file.isDirectory()) {
- throw new IllegalArgumentException(
- "Mapping directory location [" + resource + "] does not denote a directory");
- }
- sfb.addDirectory(file);
- }
- }
-
- if (this.namingStrategy != null) {
- sfb.setNamingStrategy(this.namingStrategy);
- }
-
- if (this.hibernateProperties != null) {
- sfb.addProperties(this.hibernateProperties);
- }
-
- if (this.annotatedClasses != null) {
- sfb.addAnnotatedClasses(this.annotatedClasses);
- }
-
- if (this.annotatedPackages != null) {
- sfb.addPackages(this.annotatedPackages);
- }
-
- if (this.packagesToScan != null) {
- sfb.scanPackages(this.packagesToScan);
- }
-
- this.sessionFactory = sfb.buildSessionFactory();
- }
-
-
- public SessionFactory getObject() {
- return this.sessionFactory;
- }
-
- public Class> getObjectType() {
- return (this.sessionFactory != null ? this.sessionFactory.getClass() : SessionFactory.class);
- }
-
- public boolean isSingleton() {
- return true;
- }
-
-
- public void destroy() {
- this.sessionFactory.close();
- }
-
-}
+/*
+ * Copyright 2002-2011 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.orm.hibernate4;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Properties;
+import javax.sql.DataSource;
+
+import org.hibernate.Interceptor;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.NamingStrategy;
+
+import org.springframework.beans.factory.DisposableBean;
+import org.springframework.beans.factory.FactoryBean;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.context.ResourceLoaderAware;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternUtils;
+
+/**
+ * {@link org.springframework.beans.factory.FactoryBean} that creates a
+ * Hibernate {@link org.hibernate.SessionFactory}. This is the usual way to
+ * set up a shared Hibernate SessionFactory in a Spring application context;
+ * the SessionFactory can then be passed to Hibernate-based DAOs via
+ * dependency injection.
+ *
+ * NOTE: This variant of LocalSessionFactoryBean requires Hibernate 4.0
+ * or higher. It is similar in role to the same-named class in the If this is set, the Hibernate settings should not define
+ * a connection provider to avoid meaningless double configuration.
+ */
+ public void setDataSource(DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ /**
+ * Set the location of a single Hibernate XML config file, for example as
+ * classpath resource "classpath:hibernate.cfg.xml".
+ * Note: Can be omitted when all necessary properties and mapping
+ * resources are specified locally via this bean.
+ * @see org.hibernate.cfg.Configuration#configure(java.net.URL)
+ */
+ public void setConfigLocation(Resource configLocation) {
+ this.configLocations = new Resource[] {configLocation};
+ }
+
+ /**
+ * Set the locations of multiple Hibernate XML config files, for example as
+ * classpath resources "classpath:hibernate.cfg.xml,classpath:extension.cfg.xml".
+ * Note: Can be omitted when all necessary properties and mapping
+ * resources are specified locally via this bean.
+ * @see org.hibernate.cfg.Configuration#configure(java.net.URL)
+ */
+ public void setConfigLocations(Resource[] configLocations) {
+ this.configLocations = configLocations;
+ }
+
+ /**
+ * Set Hibernate mapping resources to be found in the class path,
+ * like "example.hbm.xml" or "mypackage/example.hbm.xml".
+ * Analogous to mapping entries in a Hibernate XML config file.
+ * Alternative to the more generic setMappingLocations method.
+ * Can be used to add to mappings from a Hibernate XML config file,
+ * or to specify all mappings locally.
+ * @see #setMappingLocations
+ * @see org.hibernate.cfg.Configuration#addResource
+ */
+ public void setMappingResources(String[] mappingResources) {
+ this.mappingResources = mappingResources;
+ }
+
+ /**
+ * Set locations of Hibernate mapping files, for example as classpath
+ * resource "classpath:example.hbm.xml". Supports any resource location
+ * via Spring's resource abstraction, for example relative paths like
+ * "WEB-INF/mappings/example.hbm.xml" when running in an application context.
+ * Can be used to add to mappings from a Hibernate XML config file,
+ * or to specify all mappings locally.
+ * @see org.hibernate.cfg.Configuration#addInputStream
+ */
+ public void setMappingLocations(Resource[] mappingLocations) {
+ this.mappingLocations = mappingLocations;
+ }
+
+ /**
+ * Set locations of cacheable Hibernate mapping files, for example as web app
+ * resource "/WEB-INF/mapping/example.hbm.xml". Supports any resource location
+ * via Spring's resource abstraction, as long as the resource can be resolved
+ * in the file system.
+ * Can be used to add to mappings from a Hibernate XML config file,
+ * or to specify all mappings locally.
+ * @see org.hibernate.cfg.Configuration#addCacheableFile(java.io.File)
+ */
+ public void setCacheableMappingLocations(Resource[] cacheableMappingLocations) {
+ this.cacheableMappingLocations = cacheableMappingLocations;
+ }
+
+ /**
+ * Set locations of jar files that contain Hibernate mapping resources,
+ * like "WEB-INF/lib/example.hbm.jar".
+ * Can be used to add to mappings from a Hibernate XML config file,
+ * or to specify all mappings locally.
+ * @see org.hibernate.cfg.Configuration#addJar(java.io.File)
+ */
+ public void setMappingJarLocations(Resource[] mappingJarLocations) {
+ this.mappingJarLocations = mappingJarLocations;
+ }
+
+ /**
+ * Set locations of directories that contain Hibernate mapping resources,
+ * like "WEB-INF/mappings".
+ * Can be used to add to mappings from a Hibernate XML config file,
+ * or to specify all mappings locally.
+ * @see org.hibernate.cfg.Configuration#addDirectory(java.io.File)
+ */
+ public void setMappingDirectoryLocations(Resource[] mappingDirectoryLocations) {
+ this.mappingDirectoryLocations = mappingDirectoryLocations;
+ }
+
+ /**
+ * Set a Hibernate entity interceptor that allows to inspect and change
+ * property values before writing to and reading from the database.
+ * Will get applied to any new Session created by this factory.
+ * @see org.hibernate.cfg.Configuration#setInterceptor
+ */
+ public void setEntityInterceptor(Interceptor entityInterceptor) {
+ this.entityInterceptor = entityInterceptor;
+ }
+
+ /**
+ * Set a Hibernate NamingStrategy for the SessionFactory, determining the
+ * physical column and table names given the info in the mapping document.
+ * @see org.hibernate.cfg.Configuration#setNamingStrategy
+ */
+ public void setNamingStrategy(NamingStrategy namingStrategy) {
+ this.namingStrategy = namingStrategy;
+ }
+
+ /**
+ * Set Hibernate properties, such as "hibernate.dialect".
+ * Note: Do not specify a transaction provider here when using
+ * Spring-driven transactions. It is also advisable to omit connection
+ * provider settings and use a Spring-set DataSource instead.
+ * @see #setDataSource
+ */
+ public void setHibernateProperties(Properties hibernateProperties) {
+ this.hibernateProperties = hibernateProperties;
+ }
+
+ /**
+ * Return the Hibernate properties, if any. Mainly available for
+ * configuration through property paths that specify individual keys.
+ */
+ public Properties getHibernateProperties() {
+ if (this.hibernateProperties == null) {
+ this.hibernateProperties = new Properties();
+ }
+ return this.hibernateProperties;
+ }
+
+ /**
+ * Specify annotated entity classes to register with this Hibernate SessionFactory.
+ * @see org.hibernate.cfg.Configuration#addAnnotatedClass(String)
+ */
+ public void setAnnotatedClasses(Class>[] annotatedClasses) {
+ this.annotatedClasses = annotatedClasses;
+ }
+
+ /**
+ * Specify the names of annotated packages, for which package-level
+ * annotation metadata will be read.
+ * @see org.hibernate.cfg.Configuration#addPackage(String)
+ */
+ public void setAnnotatedPackages(String[] annotatedPackages) {
+ this.annotatedPackages = annotatedPackages;
+ }
+
+ /**
+ * Specify packages to search for autodetection of your entity classes in the
+ * classpath. This is analogous to Spring's component-scan feature
+ * ({@link org.springframework.context.annotation.ClassPathBeanDefinitionScanner}).
+ */
+ public void setPackagesToScan(String... packagesToScan) {
+ this.packagesToScan = packagesToScan;
+ }
+
+ public void setResourceLoader(ResourceLoader resourceLoader) {
+ this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
+ }
+
+
+ public void afterPropertiesSet() throws IOException {
+ LocalSessionFactoryBuilder sfb = new LocalSessionFactoryBuilder(this.dataSource, this.resourcePatternResolver);
+
+ if (this.configLocations != null) {
+ for (Resource resource : this.configLocations) {
+ // Load Hibernate configuration from given location.
+ sfb.configure(resource.getURL());
+ }
+ }
+
+ if (this.mappingResources != null) {
+ // Register given Hibernate mapping definitions, contained in resource files.
+ for (String mapping : this.mappingResources) {
+ Resource mr = new ClassPathResource(mapping.trim(), this.resourcePatternResolver.getClassLoader());
+ sfb.addInputStream(mr.getInputStream());
+ }
+ }
+
+ if (this.mappingLocations != null) {
+ // Register given Hibernate mapping definitions, contained in resource files.
+ for (Resource resource : this.mappingLocations) {
+ sfb.addInputStream(resource.getInputStream());
+ }
+ }
+
+ if (this.cacheableMappingLocations != null) {
+ // Register given cacheable Hibernate mapping definitions, read from the file system.
+ for (Resource resource : this.cacheableMappingLocations) {
+ sfb.addCacheableFile(resource.getFile());
+ }
+ }
+
+ if (this.mappingJarLocations != null) {
+ // Register given Hibernate mapping definitions, contained in jar files.
+ for (Resource resource : this.mappingJarLocations) {
+ sfb.addJar(resource.getFile());
+ }
+ }
+
+ if (this.mappingDirectoryLocations != null) {
+ // Register all Hibernate mapping definitions in the given directories.
+ for (Resource resource : this.mappingDirectoryLocations) {
+ File file = resource.getFile();
+ if (!file.isDirectory()) {
+ throw new IllegalArgumentException(
+ "Mapping directory location [" + resource + "] does not denote a directory");
+ }
+ sfb.addDirectory(file);
+ }
+ }
+
+ if (this.entityInterceptor != null) {
+ sfb.setInterceptor(this.entityInterceptor);
+ }
+
+ if (this.namingStrategy != null) {
+ sfb.setNamingStrategy(this.namingStrategy);
+ }
+
+ if (this.hibernateProperties != null) {
+ sfb.addProperties(this.hibernateProperties);
+ }
+
+ if (this.annotatedClasses != null) {
+ sfb.addAnnotatedClasses(this.annotatedClasses);
+ }
+
+ if (this.annotatedPackages != null) {
+ sfb.addPackages(this.annotatedPackages);
+ }
+
+ if (this.packagesToScan != null) {
+ sfb.scanPackages(this.packagesToScan);
+ }
+
+ this.sessionFactory = sfb.buildSessionFactory();
+ }
+
+
+ public SessionFactory getObject() {
+ return this.sessionFactory;
+ }
+
+ public Class> getObjectType() {
+ return (this.sessionFactory != null ? this.sessionFactory.getClass() : SessionFactory.class);
+ }
+
+ public boolean isSingleton() {
+ return true;
+ }
+
+
+ public void destroy() {
+ this.sessionFactory.close();
+ }
+
+}
orm.hibernate3
- * package. However, in practice, it is closer to AnnotationSessionFactoryBean
- * since its core purpose is to bootstrap a SessionFactory from annotation scanning.
- *
- * @author Juergen Hoeller
- * @since 3.1
- * @see #setDataSource
- * @see #setPackagesToScan
- */
-public class LocalSessionFactoryBean implements FactoryBeanorm.hibernate3
+ * package. However, in practice, it is closer to AnnotationSessionFactoryBean
+ * since its core purpose is to bootstrap a SessionFactory from annotation scanning.
+ *
+ * @author Juergen Hoeller
+ * @since 3.1
+ * @see #setDataSource
+ * @see #setPackagesToScan
+ */
+public class LocalSessionFactoryBean implements FactoryBean