Согласно документации hibernate :
Механизм стратегии доступа по умолчанию может быть переопределен с помощью аннотации JPA @Access
.
И в соответствии со спецификацией JPA:
2.3.2 Явный тип доступа
Тип доступа для отдельного класса сущности, отображаемого суперкласса или встраиваемого класса может быть указывается для этого класса независимо от значения по умолчанию для иерархии сущностей с помощью аннотации Access
, примененной к классу. Эта явная спецификация типа доступа не влияет на тип доступа других классов сущностей или сопоставленных суперклассов в иерархии сущностей. Применяются следующие правила:
- Когда
Access(FIELD)
применяется к классу сущности, сопоставленному суперклассу или встраиваемому классу, аннотации сопоставления могут быть помещены в переменные экземпляра этого класса, а среда выполнения поставщика сохраняемости получает доступ к постоянному состоянию через переменные экземпляра, определенные классом. Все непереходные переменные экземпляра, которые не помечены аннотацией Transient, являются постоянными. Когда Access(FIELD)
применяется к такому классу, можно выборочно назначать отдельные атрибуты внутри класса для доступа к свойству. Чтобы указать постоянное свойство для доступа со стороны среды выполнения поставщика сохраняемости, это свойство должно быть обозначено Access(PROPERTY)
. Поведение не определено, если аннотации сопоставления размещены в любых свойствах, определенных классом, для которого Access(PROPERTY)
не указано. Доступ к постоянному состоянию, унаследованному от суперклассов, осуществляется в соответствии с типами доступа этих суперклассов.
...
Итак, вы можете сделать что-то вроде этого:
@Entity(name = "Book")
@Access(AccessType.FIELD)
public static class Book {
// ...
@Id
@Access(AccessType.PROPERTY)
public Long getId() {
return id;
}
// ...
}