Эмм, извините всех, но Hibernate не требует, чтобы у ваших классов был конструктор без параметров. Спецификация JPA 2.0 требует этого, и это очень плохо для JPA. Другие фреймворки, такие как JAXB, также нуждаются в этом, что также очень плохо для этих фреймворков.
(На самом деле, JAXB якобы допускает фабрики сущностей, но он настаивает на том, чтобы самим создавать эти фабрики, требуя, чтобы у них был --guess what-- конструктор без параметров , что в моей книге точно так же хорошо как не разрешать фабрики; как это неубедительно!)
Но Hibernate не требует такой вещи.
Hibernate поддерживает механизм перехвата (см. «Перехватчик» в документации ,), который позволяет создавать экземпляры ваших объектов с любыми необходимыми им параметрами конструктора.
По сути, вы делаете так, что когда вы устанавливаете hibernate, вы передаете ему объект, реализующий интерфейс org.hibernate.Interceptor
, и тогда hibernate будет вызывать метод instantiate()
этого интерфейса всякий раз, когда ему потребуется новый экземпляр объекта ваша, так что ваша реализация этого метода может new
ваши объекты так, как вам нравится.
Я сделал это в проекте, и он работает как шарм. В этом проекте я делаю вещи через JPA, когда это возможно, и использую функции Hibernate, такие как перехватчик, только когда у меня нет другого выбора.
Hibernate, кажется, несколько небезопасен по этому поводу, так как во время запуска он выдает информационное сообщение для каждого из моих классов сущностей, сообщая мне INFO: HHH000182: No default (no-argument) constructor for class
и class must be instantiated by Interceptor
, но затем я создаю их экземпляр с помощью перехватчика, и это счастлив этим.
Чтобы ответить на вопрос «почему» вопроса об инструментах , отличных от Hibernate , ответ «абсолютно без причины», и это подтверждается существованием перехватчика гибернации. Существует множество инструментов, которые могли бы поддерживать некоторый похожий механизм для создания экземпляров клиентских объектов, но они этого не делают, поэтому они сами создают объекты, поэтому им требуются конструкторы без параметров. Я испытываю желание поверить, что это происходит потому, что создатели этих инструментов думают о себе как о системных программистах ниндзя, которые создают фреймворки, полные магии, которые будут использоваться невежественными программистами приложений, которые (как они думают) никогда не будут в своих самых смелых мечтах иметь потребность в таких продвинутых конструкциях, как ... Factory Pattern . (Хорошо, у меня соблазн так думать. Я не на самом деле так думаю. Я шучу.)