Какую аннотацию в JPA/Hibernate используют, чтобы исключить класс из маппинга?

«Какую аннотацию в JPA/Hibernate используют, чтобы исключить класс из маппинга?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В JPA/Hibernate не существует аннотации для исключения всего класса из маппинга. Класс становится сущностью только если он помечен аннотацией @Entity. Если аннотация @Entity отсутствует — класс автоматически игнорируется persistence-провайдером (Hibernate).

Важные уточнения:

  1. @Transient — НЕ для классов. Эта аннотация применяется только к полям или свойствам внутри класса-сущности, чтобы исключить их из маппинга в колонку БД.

    @Entity
    public class User {
        @Id
        private Long id;
        private String name;
        @Transient // Это поле НЕ будет сохранено в БД
        private String temporaryToken;
    }
  2. javax.persistence.Transient vs java.beans.Transient. Для JPA всегда используйте javax.persistence.Transient. java.beans.Transient предназначен для механизмов сериализации и JPA его игнорирует.

  3. Исключение класса из сканирования сущностей. Если класс ошибочно помечен @Entity, но его нужно проигнорировать, это настраивается на уровне конфигурации сканирования пакетов в persistence.xml или свойствах Spring (@EntityScan).

Правильный подход:

  • Чтобы класс не был сущностью — просто не ставьте @Entity.
  • Чтобы исключить поле сущности — используйте @Transient.
  • Чтобы временно отключить сущность — используйте настройки сканирования пакетов или профили (например, в Spring).