diff --git a/src/NHibernate.Test/App.config b/src/NHibernate.Test/App.config index 1e1078fe6f3..188524f7d1d 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..ef569879acb --- /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 a8d325494c7..899d28f1760 100644 --- a/src/NHibernate.Test/NHibernate.Test.csproj +++ b/src/NHibernate.Test/NHibernate.Test.csproj @@ -147,6 +147,7 @@ + @@ -3630,4 +3631,4 @@ if exist hibernate.cfg.xml (del hibernate.cfg.xml) if exist "$(ProjectDir)hibernate.cfg.xml" (copy "$(ProjectDir)hibernate.cfg.xml" "hibernate.cfg.xml") copy /y "..\..\..\NHibernate.DomainModel\ABC.hbm.xml" "ABC.hbm.xml" - + \ No newline at end of file diff --git a/src/NHibernate/Cfg/Environment.cs b/src/NHibernate/Cfg/Environment.cs index 694e4679684..91f0ca0f48f 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 316c4dbf323..56a2f73635c 100644 --- a/src/NHibernate/Cfg/Loquacious/FluentSessionFactoryConfiguration.cs +++ b/src/NHibernate/Cfg/Loquacious/FluentSessionFactoryConfiguration.cs @@ -46,6 +46,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 1b12d014d02..6f14bdc6bb0 100644 --- a/src/NHibernate/Cfg/Loquacious/IFluentSessionFactoryConfiguration.cs +++ b/src/NHibernate/Cfg/Loquacious/IFluentSessionFactoryConfiguration.cs @@ -25,6 +25,8 @@ public interface IFluentSessionFactoryConfiguration IFluentSessionFactoryConfiguration GenerateStatistics(); IFluentSessionFactoryConfiguration Using(EntityMode entityMode); + IFluentSessionFactoryConfiguration DefaultFlushMode(FlushMode flushMode); + IFluentSessionFactoryConfiguration ParsingHqlThrough() where TQueryTranslator : IQueryTranslatorFactory; IProxyConfiguration Proxy { get; } diff --git a/src/NHibernate/Cfg/Settings.cs b/src/NHibernate/Cfg/Settings.cs index 4ada5f7abc8..089ec96c7e5 100644 --- a/src/NHibernate/Cfg/Settings.cs +++ b/src/NHibernate/Cfg/Settings.cs @@ -105,7 +105,9 @@ public Settings() public bool IsOrderUpdatesEnabled { get; internal set; } - public bool IsOrderInsertsEnabled { get; internal set; } + public bool IsOrderInsertsEnabled { get; internal set; } + + public FlushMode DefaultFlushMode { get; internal set; } public EntityMode DefaultEntityMode { get; internal set; } diff --git a/src/NHibernate/Cfg/SettingsFactory.cs b/src/NHibernate/Cfg/SettingsFactory.cs index b58ecc1b127..bd86265a1ad 100644 --- a/src/NHibernate/Cfg/SettingsFactory.cs +++ b/src/NHibernate/Cfg/SettingsFactory.cs @@ -256,6 +256,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 75bd9502169..eb68bf4acda 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 ad7c93c1a16..42cd9782f7c 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 a7972ca383b..c955001c3a9 100644 --- a/src/NHibernate/nhibernate-configuration.xsd +++ b/src/NHibernate/nhibernate-configuration.xsd @@ -110,6 +110,7 @@ +