Стратегия доступа к гибернации для свойства @Id - PullRequest
2 голосов
/ 16 июня 2020

Стратегия доступа Hibernate указывается неявно путем аннотирования атрибута первичного ключа или его метода получения аннотацией @Id. Таким образом, в зависимости от стратегии доступа @Id она применяется ко всем свойствам (или полям).

Можно ли установить доступ FIELD для объекта сущности, но доступ к свойству только для свойства @Id? Как его настроить?

1 Ответ

1 голос
/ 16 июня 2020

Согласно документации 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;
    }

    // ...
}
...