Ответ 1
По умолчанию тип доступа определяется местом, где вы помещаете аннотацию идентификатора (@Id
). Если вы положите его на поле - это будет AccessType.FIELD
, если вы поместите его на геттер - это будет AccessType.PROPERTY
.
Иногда вам может потребоваться аннотировать не поля, а свойства (например, потому что вы хотите иметь какую-то произвольную логику в getter или потому, что вы так предпочитаете). В такой ситуации вы должны определить геттер и аннотировать его как AccessType.PROPERTY
.
Насколько я помню, если вы укажете либо AccessType.FIELD
, либо AccessType.PROPERTY
для любого из полей/методов сущности, вы должны указать поведение по умолчанию для всего класса. И поэтому вам нужно иметь AccessType.FIELD
на уровне класса (несмотря на то, что AccessType.FIELD
- значение по умолчанию.)
Теперь, если у вас не было бы @Transient
в поле phnnumber
, JPA предоставит вам таблицу с тремя столбцами:
- id,
- phnnumber,
- getphnnumber.
Это потому, что он использовал бы AccessType.FIELD
для всех полей сущности (id
и phnnumber
) и в то же время использовал бы AccessType.PROPERTY
для вашего получателя (getPhnnumber()
). < ш > Вы закончите с номером телефона, дважды отображаемым в базе данных.
Следовательно, требуется аннотация @Transient
- это означает, что объект не сохранит значение поля в базовом хранилище, но значение, возвращаемое вашим getter.