diff --git a/src/NHibernate.Test/App.config b/src/NHibernate.Test/App.config index bd345778701..356ed814805 100644 --- a/src/NHibernate.Test/App.config +++ b/src/NHibernate.Test/App.config @@ -51,6 +51,8 @@ true false 444 + + Commit diff --git a/src/NHibernate.Test/CfgTest/DefaultFlushModeFixture.cs b/src/NHibernate.Test/CfgTest/DefaultFlushModeFixture.cs new file mode 100644 index 00000000000..4a72d2bbae9 --- /dev/null +++ b/src/NHibernate.Test/CfgTest/DefaultFlushModeFixture.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NHibernate.Cfg; +using NUnit.Framework; + +namespace NHibernate.Test.CfgTest +{ + [TestFixture] + public class DefaultFlushModeFixture + { + [Test] + public void CanSetDefaultFlushModeThroughXmlConfiguration() + { + var cfg = new Configuration().Configure(); + + using (var sessionFactory = cfg.BuildSessionFactory()) + { + using (var session = sessionFactory.OpenSession()) + { + Assert.AreEqual(session.FlushMode, FlushMode.Commit); + } + } + } + + [Test] + public void CanSetDefaultFlushModeThroughStandardConfiguration() + { + var cfg = new Configuration().Configure(); + cfg.Properties[Environment.DefaultFlushMode] = FlushMode.Always.ToString(); + + using (var sessionFactory = cfg.BuildSessionFactory()) + { + using (var session = sessionFactory.OpenSession()) + { + Assert.AreEqual(session.FlushMode, FlushMode.Always); + } + } + + cfg.Properties[Environment.DefaultFlushMode] = FlushMode.Commit.ToString(); + + using (var sessionFactory = cfg.BuildSessionFactory()) + { + using (var session = sessionFactory.OpenSession()) + { + Assert.AreEqual(session.FlushMode, FlushMode.Commit); + } + } + } + + [Test] + public void CanSetDefaultFlushModeThroughLoquaciousConfiguration() + { + var cfg = new Configuration() + .Configure(); + + cfg + .SessionFactory() + .DefaultFlushMode(FlushMode.Always); + + using (var sessionFactory = cfg.BuildSessionFactory()) + { + using (var session = sessionFactory.OpenSession()) + { + Assert.AreEqual(session.FlushMode, FlushMode.Always); + } + } + + cfg.Configure() + .SessionFactory() + .DefaultFlushMode(FlushMode.Commit); + + using (var sessionFactory = cfg.BuildSessionFactory()) + { + using (var session = sessionFactory.OpenSession()) + { + Assert.AreEqual(session.FlushMode, FlushMode.Commit); + } + } + } + } +} diff --git a/src/NHibernate.Test/NHibernate.Test.csproj b/src/NHibernate.Test/NHibernate.Test.csproj index 44b9c69daa0..a8e781f928e 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -166,6 +166,7 @@ + diff --git a/src/NHibernate/Cfg/Environment.cs b/src/NHibernate/Cfg/Environment.cs index bae74bd511a..ed597208cad 100644 --- a/src/NHibernate/Cfg/Environment.cs +++ b/src/NHibernate/Cfg/Environment.cs @@ -90,6 +90,9 @@ public static string Version /// The EntityMode in which set the Session opened from the SessionFactory. public const string DefaultEntityMode = "default_entity_mode"; + /// Implementation of NH-3619 - Make default value of FlushMode configurable + public const string DefaultFlushMode = "default_flush_mode"; + /// /// When using an enhanced id generator and pooled optimizers (), /// prefer interpreting the database value as the lower (lo) boundary. The default is to interpret it as the high boundary. diff --git a/src/NHibernate/Cfg/Loquacious/FluentSessionFactoryConfiguration.cs b/src/NHibernate/Cfg/Loquacious/FluentSessionFactoryConfiguration.cs index f5dc921c471..d53ad96226c 100644 --- a/src/NHibernate/Cfg/Loquacious/FluentSessionFactoryConfiguration.cs +++ b/src/NHibernate/Cfg/Loquacious/FluentSessionFactoryConfiguration.cs @@ -47,6 +47,12 @@ public IFluentSessionFactoryConfiguration Using(EntityMode entityMode) return this; } + public IFluentSessionFactoryConfiguration DefaultFlushMode(FlushMode flushMode) + { + configuration.SetProperty(Environment.DefaultFlushMode, flushMode.ToString()); + return this; + } + public IFluentSessionFactoryConfiguration ParsingHqlThrough() where TQueryTranslator : IQueryTranslatorFactory { diff --git a/src/NHibernate/Cfg/Loquacious/IFluentSessionFactoryConfiguration.cs b/src/NHibernate/Cfg/Loquacious/IFluentSessionFactoryConfiguration.cs index 23ac2c3abe4..c16897b84a5 100644 --- a/src/NHibernate/Cfg/Loquacious/IFluentSessionFactoryConfiguration.cs +++ b/src/NHibernate/Cfg/Loquacious/IFluentSessionFactoryConfiguration.cs @@ -26,6 +26,8 @@ public interface IFluentSessionFactoryConfiguration IFluentSessionFactoryConfiguration GenerateStatistics(); IFluentSessionFactoryConfiguration Using(EntityMode entityMode); + IFluentSessionFactoryConfiguration DefaultFlushMode(FlushMode flushMode); + IFluentSessionFactoryConfiguration ParsingHqlThrough() where TQueryTranslator : IQueryTranslatorFactory; IFluentSessionFactoryConfiguration ParsingLinqThrough() where TQueryProvider : INhQueryProvider; diff --git a/src/NHibernate/Cfg/Settings.cs b/src/NHibernate/Cfg/Settings.cs index 5856837f5f3..f2057651d34 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -110,6 +110,8 @@ public Settings() public bool IsOrderInsertsEnabled { get; internal set; } + public FlushMode DefaultFlushMode { get; internal set; } + public EntityMode DefaultEntityMode { get; internal set; } public bool IsDataDefinitionImplicitCommit { get; internal set; } diff --git a/src/NHibernate/Cfg/SettingsFactory.cs b/src/NHibernate/Cfg/SettingsFactory.cs index f2fc0fea68f..7e852fde5c7 100644 --- a/src/NHibernate/Cfg/SettingsFactory.cs +++ b/src/NHibernate/Cfg/SettingsFactory.cs @@ -259,6 +259,11 @@ public Settings BuildSettings(IDictionary properties) } } + //NH-3619 + FlushMode defaultFlushMode = (FlushMode) Enum.Parse(typeof(FlushMode), PropertiesHelper.GetString(Environment.DefaultFlushMode, properties, FlushMode.Unspecified.ToString()), false); + log.Info("Default flush mode: " + defaultFlushMode); + settings.DefaultFlushMode = defaultFlushMode; + EntityMode defaultEntityMode = EntityModeHelper.Parse(PropertiesHelper.GetString(Environment.DefaultEntityMode, properties, "poco")); log.Info("Default entity-mode: " + defaultEntityMode); diff --git a/src/NHibernate/Impl/SessionFactoryImpl.cs b/src/NHibernate/Impl/SessionFactoryImpl.cs index 6ece3cf91f7..ac08d74c2e5 100644 --- a/src/NHibernate/Impl/SessionFactoryImpl.cs +++ b/src/NHibernate/Impl/SessionFactoryImpl.cs @@ -497,7 +497,7 @@ public ISession OpenSession(IDbConnection connection, bool flushBeforeCompletion return new SessionImpl(connection, this, true, settings.CacheProvider.NextTimestamp(), interceptor, settings.DefaultEntityMode, flushBeforeCompletionEnabled, autoCloseSessionEnabled, - isInterceptorsBeforeTransactionCompletionIgnoreExceptionsEnabled, connectionReleaseMode); + isInterceptorsBeforeTransactionCompletionIgnoreExceptionsEnabled, connectionReleaseMode, settings.DefaultFlushMode); } public IEntityPersister GetEntityPersister(string entityName) @@ -1215,7 +1215,8 @@ private SessionImpl OpenSession(IDbConnection connection, bool autoClose, long t SessionImpl session = new SessionImpl(connection, this, autoClose, timestamp, sessionLocalInterceptor ?? interceptor, settings.DefaultEntityMode, settings.IsFlushBeforeCompletionEnabled, settings.IsAutoCloseSessionEnabled, isInterceptorsBeforeTransactionCompletionIgnoreExceptionsEnabled, - settings.ConnectionReleaseMode); + settings.ConnectionReleaseMode, settings.DefaultFlushMode); + if (sessionLocalInterceptor != null) { // NH specific feature diff --git a/src/NHibernate/Impl/SessionImpl.cs b/src/NHibernate/Impl/SessionImpl.cs index 71d90f2f7be..885399a2536 100644 --- a/src/NHibernate/Impl/SessionImpl.cs +++ b/src/NHibernate/Impl/SessionImpl.cs @@ -215,7 +215,8 @@ internal SessionImpl( bool flushBeforeCompletionEnabled, bool autoCloseSessionEnabled, bool ignoreExceptionBeforeTransactionCompletion, - ConnectionReleaseMode connectionReleaseMode) + ConnectionReleaseMode connectionReleaseMode, + FlushMode defaultFlushMode) : base(factory) { using (new SessionIdLoggingContext(SessionId)) @@ -235,6 +236,7 @@ internal SessionImpl( this.connectionReleaseMode = connectionReleaseMode; this.ignoreExceptionBeforeTransactionCompletion = ignoreExceptionBeforeTransactionCompletion; connectionManager = new ConnectionManager(this, connection, connectionReleaseMode, interceptor); + this.flushMode = defaultFlushMode; if (factory.Statistics.IsStatisticsEnabled) { diff --git a/src/NHibernate/nhibernate-configuration.xsd b/src/NHibernate/nhibernate-configuration.xsd index d1942c3e3a4..2b74d4dd35b 100644 --- a/src/NHibernate/nhibernate-configuration.xsd +++ b/src/NHibernate/nhibernate-configuration.xsd @@ -111,6 +111,7 @@ +