Я только что исправил эту проблему в JDK9 и JDK8u45. См. эту ошибку . Для перехода к продвинутым сборкам потребуется немного времени. Дэн просто указал мне на этот вопрос StackOverflow, поэтому я добавляю эту заметку. Когда вы находите ошибки, пожалуйста, отправьте их.
Я обратился к этому с помощью того, что компилятор создает мост, а также подход ко многим случаям ссылок на сложные методы. Мы также изучаем технические последствия.
Во многих случаях вам не нужно заботиться о сбрасывании NHibernate.
Вам нужно вызывать flush только в том случае, если вы создали свое собственное соединение , потому что NHibernate не знает, когда вы совершаете его.
Что действительно важно для вас, так это транзакция. Во время транзакции вы изолированы от других транзакций, это означает, что вы всегда видите свои изменения при чтении из базы данных и не видите других изменений (если они не зафиксированы). Поэтому вам не нужно беспокоиться, когда NHibernate обновляет данные в базе данных, если они не зафиксированы. В любом случае он никому не виден.
NHibernate сбрасывает, если
Пример:
using (session = factory.CreateSession())
using (session.BeginTransaction())
{
var entity = session.Get<Entity>(2);
entity.Name = "new name";
// there is no update. NHibernate flushes the changes.
session.Transaction.Commit();
session.Close();
}
Объект обновляется при коммите. NHibernate видит, что ваш сеанс грязный, и сбрасывает изменения в базу данных. Вам нужно обновлять и сохранять, только если вы внесли изменения вне сеанса. (Это означает, что с отсоединенной сущностью, которая является сущностью, неизвестной сеансу).
Замечания по производительности: Flush не только выполняет требуемые операторы SQL для обновления базы данных. Он также ищет изменения в памяти. Поскольку в POCO нет грязного флага, необходимо сравнить каждое свойство каждого объекта в сеансе с его кэшем первого уровня. Это может стать проблемой производительности, когда это делается слишком часто. Есть несколько вещей, которые вы можете сделать, чтобы избежать проблем с производительностью:
NHibernate будет выполнять операторы SQL только тогда, когда это необходимо. Это откладывает выполнение операторов SQL на максимально возможное время.
Например, когда вы сохраняете сущность, у которой есть назначенный идентификатор, она, скорее всего, откладывает выполнение оператора INSERT. Однако, когда вы вставляете сущность, которая имеет идентификатор автоинкремента, например, тогда NHibernate должен ВСТАВИТЬ сущность непосредственно, так как он должен знать идентификатор, который будет назначен этой сущности.
Когда вы явно вызываете flush, затем NHibernate выполнит операторы SQL, необходимые для объектов, которые были изменены / созданы / удалены в этом сеансе.