Hibernate настроить, как создать объект - PullRequest
3 голосов
/ 08 октября 2010

Можно ли настроить Hiberate / NHibernate так, чтобы он не использовал конструктор по умолчанию для создания объектов при чтении из базы данных?

Когда Hibernate читает 10 клиентов из таблицы, он создает 10Customer объектов.Он делает это с помощью

Customer c = new Customer();

Могу ли я сказать Hibernate сделать следующее:

Customer c = ACertainStaticFactory.CreateNewCustomer();

или даже управлять фабричным экземпляром:

ACertainFactory factory = .....;
Customer c = factory.CreateNewCustomer();

илиеще более сложно передать параметр, который я установил ранее:

// My client code
Query query = session.CreateQuery(...);
// either:
query.SetSomeParameter(someObject);
// or:
session.SetSomeParameter(someObject);

query.List();

// Hibernate should then behave like this:
Customer c = new Customer(someObject);
// or
Customer c = ACertainStaticFactory.CreateNewCustomer(someObject);
// etc.

Возможно ли это в любом случае?Если да, то как?Если нет: есть ли альтернатива?

Ответы [ 2 ]

2 голосов
/ 09 октября 2010

Когда Hibernate читает 10 клиентов из таблицы, он создает 10 объектов Customer. Это делает это (...)

Точнее, Hibernate использует Class<T>#newInstance() для создания новых экземпляров сущности, которая опирается на конструктор без аргументов. Отсюда необходимость его предоставления.

Возможно ли это в любом случае? Если да, то как? Если нет: есть ли альтернатива?

Ваше требование похоже на Возможность иметь гидратные объекты Hibernate с Фабрикой? на форумах Hibernate, поэтому я процитирую ответ Стива (обновлен для соответствия текущим именам):

Это вполне выполнимо. На самом деле вы есть два варианта:

  1. создать пользовательскую реализацию EntityPersister;
  2. создать пользовательскую реализацию Interceptor, в частности Interceptor.instantiate() метод будет представлять интерес для вас ...

Думаю, я бы пошел по пути перехватчиков (не уверен насчет вашего сложного сценария, но реализация фабричного подхода выглядит довольно просто).

0 голосов
/ 08 октября 2010

Проверьте это, может быть полезно:

http://fabiomaulo.blogspot.com/2008/11/entities-behavior-injection.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...