Для Hibernate требуется конструктор без аргументов, и во всех языках, которые поддерживают перегрузку методов, это, вероятно, не проблема, но я столкнулся с действительно раздражающей проблемой в ColdFusion ORM (которая полагается на Hibernate под капотом).
Если я объявляю пользовательский конструктор (метод инициализации) для своих сущностей, и этот конструктор требует некоторых аргументов, Hibernate не сможет восстановить мои сущности, потому что он вызывает пользовательский конструктор.
Из-за такого поведения кажется почти невозможным спроектировать всегда действительные объекты, и поэтому CF-ORM почти полностью бесполезен.
Единственный обходной путь, который я нашел, - это объявить другой пользовательский метод, который я использую в качестве конструктора, который делает экземпляры объектов теперь похожими на new SomeEntity().construct(...)
или createObject('component', 'SomeEntity').construct(...)
. Это довольно хлопотно...
Что очень глупо во всем этом, так это то, что вы можете создать экземпляр сущности, не вызывая метод init
, используя createObject
, поэтому мне интересно, почему они решили заставить Hibernate вызывать метод init
в своей реализации, учитывая тот факт, что он даже не передает параметры, а устанавливает их потом другими средствами.
В любом случае, есть ли другие способы решения этой проблемы?
РЕДАКТИРОВАТЬ:
Person
должна иметьname
, то я бы не позволил создавать экземпляр компонентаPerson
без него, но это не позволит мне использовать CF-ORM, потому что функцияinit
будет вызываться без аргументов при регидратации объектов. Это не проблема в языках, где конструктор может быть перегружен. - person plalx   schedule 02.02.2015new Person( {firstName: 'Bob', lastName: 'Johnson'})
. Хотя, я считаю, что это было введено в CF10. Всегда можно было обновить. - person Scott Stroz   schedule 02.02.2015createObject()
илиnew Person()
для загрузки данных из базы данных? Я не уверен, что это лучший способ извлечения данных объекта из базы данных в ColdFusion. Я склонен использоватьentityLoad()
при загрузке нескольких объектов - или с использованием нескольких критериев илиentityLoadByPK()
, когда у меня есть ПК для определенного объекта. Единственный раз, когда я буду использоватьcreateObject()
илиnew Person()
, это когда я создаю новый экземпляр. - person Scott Stroz   schedule 02.02.2015entityLoad
, Hibernate регидратирует ваши сущности. Для этого он сначала вызовет конструктор для создания новых экземпляров компонента, а затем будет использовать отражение для установки полей. - person plalx   schedule 02.02.2015createObject().constructor()
илиnew Person().constructor()
позволяет загружать данные из базы данных и заполнять свойства. - person Scott Stroz   schedule 02.02.2015