2016-04-14 2 views
3

У меня вопрос о прокси-сервере в NHibernate. Я внутри в моем файле журнала много журналов, как: Сужение прокси - этой операции нарушается == Есть несколько других вопросов в Интернете и другой ответ:NHibernate warning Ограничение прокси-сервера - эта операция прерывается ==

Stackoverflow NHibernate narrowing proxy warningпричем большая сделка или не зависит от уровня риска, который вы готовы принять. Поскольку всегда существует разрыв между вашим кодом и вашей базой данных, вы не всегда можете гарантировать, что кастинг будет работать. Это приведет к ошибкам, которые могут быть трудно диагностировать и не могут быть разрешены без изменений в базе данных или коде.

Другой пост из спящего режима:

Narrowing problemНе беспокойтесь о его предупреждения, просто поместите в файл журнала, и вы не должны видеть его больше ...

Почему это происходит? Предположим, что у вас есть Продукт с ассоциацией «много-к-одному» для адреса. Оба являются объектами, а Address имеет подкласс ShippingAddress.

Let's Session.get (..) Продукт из db, у которого есть ShippingAddress как ассоциация. Поскольку много-к-одному ленив, он вернет адресный прокси. Обратите внимание, что это прокси-адрес Address, а не прокси-сервер ShippingAddress, поскольку прокси-сервер всегда будет соответствовать типу, указанному в Product (подробнее см. Книгу спящего режима).

Этот прокси-сервер хранится в Hibernate в его прокси-кеше. Теперь мы Session.get (...) тот же ShippingAddress из db, тот, который связан с Продуктом, который мы использовали, извлеченным из db. Теперь Hibernate увидит, что он уже содержит прокси для этого ShippingAddress и вернет его. Тем не менее, он заметит, что типы не совпадают, так что должно произойти «понижение». Поскольку это последнее действие невозможно с помощью «прокси», оно создаст новый и вернет его ...

Как вы можете видеть, не о чем беспокоиться. Вы можете рассмотреть возможность создания адреса типа значения ... В моем случае это не вариант.

И последний

ProxyWarnLog Removed in Hibernate 4?

Вот код из NHibernate: StatefulPersistenceContext.cs -> NarrowProxy(..)

Таким образом, это проблема или нет? Я всегда работаю с отдельными объектами в своей программе. Надеюсь, кто-то может мне помочь. Большое спасибо.

ответ

1

Это может быть проблемой при использовании оператора == для сравнения объектов и определения того, являются ли они такими же или нет.

Это происходит аналогично (но с Equals), когда вы добавляете объект в коллекцию, отображаемую как set.Если набор уже содержит объект, но создается экземпляр через другой тип прокси, addможет не соблюдать свой договор, он может снова добавить объект, а set будет содержать два вхождения одного и того же объекта.

Это может, не будет, потому что вы можете избежать этой проблемы путем переопределения EqualsGetHashcode, как это обязательно возвращать тот же хэш-код для объектов равны) на ваших лицах, в заказ для сравнения их через их первичный ключ и тип сущности. Для set достаточно (поскольку он не использует оператора ==, но метод Equals, придание приоритета одному из IEquatable<T>, если ваш тип реализует его).

Для == вам необходимо определить операторы == и != вашего класса для использования вашей реализации Equals.

Прочтите here или here для получения дополнительной информации об этом. Остерегайтесь, их примеры реализации являются просто примерами и не подходят для модели домена с использованием наследования. Прочитайте here для переопределения примера обработки наследования. (Но он не обрабатывает переходные объекты: лучше приложите к нему окончательный тест на natural ids, если он есть один, вместо того, чтобы давать ложное, если оба они считаются переходными, но не являются одной и той же ссылкой.) И этот blog предоставляет базовый класс с переопределенным == (найдено в этом Stack Overflow question).

Работа с отдельными объектами увеличивает этот риск. Если вы еще не переопределили эти два метода для своих объектов, было бы безопаснее сделать это, независимо от этого предупреждения.