Java хранит информацию общего типа о суперклассе, и вы можете получить ее через Class.getGenericSuperclass()
.
Поскольку ваш AbstractGenericDao
предназначен для наследования, this.getClass()
всегда будет возвращать подтип AbstractGenericDao
.Это означает, что this.getClass().getGenericSuperclass()
даст вам полный универсальный тип AbstractGenericDao
, например, что-то вроде AbstractGenericDao<Book>
.Поскольку вы знаете, AbstractGenericDao
является параметризованным типом (он имеет параметр типа T
), вы можете привести его к ParameterizedType
, а затем получить фактический тип T
, например, Book
, вызвав getActualTypeArguments()[0]
(как T
- первый и единственный параметр).По сути, это трюк, чтобы получить фактический тип сущности в DAO.
Теперь, как написано, этот код содержит ошибки.AbstractEntityDao
не является абстрактным, и может быть создан непосредственно, что порвет эту строку, потому что его общий суперкласс будет Object
.Более того, если какой-то класс не расширяет AbstractEntityDao
напрямую, но через еще один класс, эта строка, скорее всего, снова оборвется, поскольку суперкласс будет чем-то отличным от AbstractEntityDao
.
Что касается вашегодругие 4 вопроса - persist
сохраняет ( сохраняется ) объект в БД.merge
обновляет его в БД.Все это базовые концепции JPA / Hibernate, о которых вы узнаете за 5 минут чтения любого учебного пособия.Так что сделайте свое собственное исследование, прежде чем спрашивать, и не задавайте 5 вопросов в одном сообщении.