[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-hibernate-osnovnye-annotatsii-mappinga-sushchnostey":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":18,"progress":19,"seo":20},752,"osnovnye-annotatsii-mappinga-sushchnostey",19,"hibernate","Hibernate","🐻","Основные аннотации маппинга сущностей","Аннотации JPA определяют, как Java-классы и поля маппятся на таблицы и столбцы.\n\n\u003Cdetails>\n\u003Csummary>Пример полного маппинга сущности\u003C\u002Fsummary>\n\n```java\n@Entity                                    \u002F\u002F класс — JPA-сущность\n@Table(name = \"users\",                     \u002F\u002F таблица в БД\n       uniqueConstraints = @UniqueConstraint(columnNames = \"email\"),\n       indexes = @Index(columnList = \"name\"))\npublic class User {\n\n    @Id                                    \u002F\u002F первичный ключ\n    @GeneratedValue(strategy = GenerationType.IDENTITY) \u002F\u002F автоинкремент\n    private Long id;\n\n    @Column(name = \"user_name\",            \u002F\u002F имя столбца\n            nullable = false,              \u002F\u002F NOT NULL\n            length = 100)                  \u002F\u002F VARCHAR(100)\n    private String name;\n\n    @Column(unique = true, nullable = false)\n    private String email;\n\n    @Enumerated(EnumType.STRING)           \u002F\u002F enum как строка (не ordinal!)\n    @Column(nullable = false)\n    private UserStatus status;\n\n    @Temporal(TemporalType.TIMESTAMP)      \u002F\u002F для java.util.Date (не нужен для LocalDateTime)\n    private Date createdAt;\n\n    @Lob                                   \u002F\u002F BLOB\u002FCLOB — для больших объектов\n    private String description;\n\n    @Transient                             \u002F\u002F не маппится в БД\n    private String temporaryField;\n\n    @Embedded                              \u002F\u002F встраиваемый объект\n    private Address address;\n\n    @Version                               \u002F\u002F оптимистичная блокировка\n    private Long version;\n}\n\n@Embeddable                                \u002F\u002F встраиваемый компонент (без своей таблицы)\npublic class Address {\n    private String city;\n    private String street;\n\n    @Column(name = \"zip_code\")\n    private String zipCode;\n}\n```\n\n\u003C\u002Fdetails>\n\n### Краткая таблица аннотаций\n\n| Аннотация | Назначение |\n|-----------|-----------|\n| `@Entity` | Маркирует класс как JPA-сущность |\n| `@Table` | Настройка таблицы (имя, уникальные ограничения, индексы) |\n| `@Id` | Первичный ключ |\n| `@GeneratedValue` | Стратегия генерации ID |\n| `@Column` | Настройка столбца (имя, nullable, unique, length) |\n| `@Enumerated` | Маппинг enum (STRING или ORDINAL) |\n| `@Temporal` | Тип для `java.util.Date` |\n| `@Lob` | Большие объекты (BLOB, CLOB) |\n| `@Transient` | Поле не маппится в БД |\n| `@Embedded` \u002F `@Embeddable` | Встраиваемый объект без собственной таблицы |\n| `@Version` | Поле для оптимистичной блокировки |\n\n### Важное\n\n- `@Entity` обязательна; класс должен иметь конструктор без аргументов и `@Id`\n- `@Column` необязательна — без неё поле маппится по имени\n- `@Enumerated(EnumType.STRING)` — всегда используйте STRING, не ORDINAL (добавление значения в enum сломает данные)\n- `@Embedded` \u002F `@Embeddable` — способ декомпозиции сущности без создания отдельной таблицы\n\n### Частые ошибки\n\n- `@Enumerated(EnumType.ORDINAL)` — при изменении порядка элементов enum данные в БД станут некорректными\n- Отсутствие `@Version` — без оптимистичной блокировки потерянные обновления (lost updates) неизбежны при конкурентном доступе\n- `@Column(nullable = false)` без NOT NULL в БД — аннотация влияет только на DDL-генерацию; если БД уже создана через миграции, ограничение нужно добавлять в миграции\n- Маппинг `boolean` → `@Column` — по умолчанию маппится в BIT\u002FBOOLEAN, но в Oracle нет BOOLEAN; нужен `@Column(columnDefinition = \"NUMBER(1)\")`\n\n### Как используется в 2026\n\n- Hibernate 6.x поддерживает Java Records как `@Embeddable` — удобнее для Value Objects\n- `@JdbcTypeCode(SqlTypes.JSON)` — нативная поддержка JSON-столбцов в Hibernate 6\n- Temporal API (LocalDate, LocalDateTime) маппится без `@Temporal` начиная с JPA 2.2\n- `@SoftDelete` (Hibernate 6.4) — встроенная поддержка мягкого удаления\n\n> **На собеседовании:** минимальный набор, который нужно знать: `@Entity`, `@Table`, `@Id`, `@GeneratedValue`, `@Column`, `@Enumerated(STRING)`. Интервьюер часто спрашивает про ORDINAL vs STRING — правильный ответ всегда STRING. Бонус — упомянуть `@Version` для оптимистичной блокировки и `@Embeddable` для Value Objects.","","junior",[15,16,17,7],"mapping","annotations","jpa",[],null,{"title":21,"description":22,"ogTitle":23,"ogDescription":24,"keywords":25,"schemaAnswer":35,"featuredSnippetReady":36},"Основные аннотации маппинга сущностей в JPA — Gymterview","Аннотации JPA: @Entity, @Table, @Id, @GeneratedValue, @Column, @Enumerated, @Lob, @Transient, @Embedded, @Version. Примеры и типичные ошибки.","JPA-аннотации маппинга: @Entity, @Table, @Column, @Id и другие — Gymterview","Полный обзор аннотаций JPA для маппинга сущностей с примерами кода. @Enumerated STRING vs ORDINAL, @Embedded, @Version.",[26,27,28,29,30,31,32,33,34,8],"JPA аннотации","@Entity","@Table","@Column","@Id","@GeneratedValue","@Enumerated","@Embedded","@Version","Основные аннотации JPA: @Entity (маркер сущности), @Table (настройка таблицы), @Id (PK), @GeneratedValue (генерация ID), @Column (настройка столбца), @Enumerated(STRING) (enum как строка), @Lob (BLOB\u002FCLOB), @Transient (не маппится), @Embedded\u002F@Embeddable (встраиваемый объект), @Version (оптимистичная блокировка). Всегда STRING для enum, не ORDINAL.",true]