Аннотации JPA: @OneToOne, @ManyToMany, @JoinColumn, @Lob, @Query, @Modifying, @EnableJpaRepositories
1. @OneToOne
Аннотация @OneToOne используется для определения связи "один к одному" между сущностями. Это может быть, например, связь между пользователем и его профилем.
2. @ManyToMany
@ManyToMany обозначает связь "многие ко многим". Это используется, когда несколько сущностей одной таблицы могут быть связаны с несколькими сущностями другой таблицы.
3. @JoinColumn
Аннотация @JoinColumn задаёт внешний ключ для связи. Она может использоваться с аннотациями @OneToOne и @ManyToOne.
4. @Lob
@Lob используется для маппинга больших объектов, таких как текстовые или бинарные данные.
5. @Query
Аннотация @Query позволяет задавать JPQL или SQL-запросы прямо в репозитории.
6. @Modifying
Используется вместе с @Query для выполнения операций обновления или удаления данных.
7. @EnableJpaRepositories
Эта аннотация активирует JPA-репозитории в Spring Boot.
#Java #Training #Spring #OneToOne #ManyToMany #JoinColumn #Lob #Query #Modifying #EnableJpaRepositories
1. @OneToOne
Аннотация @OneToOne используется для определения связи "один к одному" между сущностями. Это может быть, например, связь между пользователем и его профилем.
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne
@JoinColumn(name = "profile_id", referencedColumnName = "id")
private Profile profile;
}
@Entity
public class Profile {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String bio;
}
Здесь связь между User и Profile устанавливается через внешний ключ profile_id.
2. @ManyToMany
@ManyToMany обозначает связь "многие ко многим". Это используется, когда несколько сущностей одной таблицы могут быть связаны с несколькими сущностями другой таблицы.
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
}
Связь осуществляется через промежуточную таблицу student_course.
3. @JoinColumn
Аннотация @JoinColumn задаёт внешний ключ для связи. Она может использоваться с аннотациями @OneToOne и @ManyToOne.
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "customer_id", nullable = false)
private Customer customer;
}
Здесь customer_id в таблице Order будет внешним ключом, ссылающимся на таблицу Customer.
4. @Lob
@Lob используется для маппинга больших объектов, таких как текстовые или бинарные данные.
@Entity
public class Document {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Lob
private String content; // Для больших текстов
@Lob
private byte[] fileData; // Для бинарных данных
}
5. @Query
Аннотация @Query позволяет задавать JPQL или SQL-запросы прямо в репозитории.
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.email = :email")
User findByEmail(@Param("email") String email);
}
6. @Modifying
Используется вместе с @Query для выполнения операций обновления или удаления данных.
public interface UserRepository extends JpaRepository<User, Long> {
@Modifying
@Query("UPDATE User u SET u.name = :name WHERE u.id = :id")
void updateUserName(@Param("id") Long id, @Param("name") String name);
}
7. @EnableJpaRepositories
Эта аннотация активирует JPA-репозитории в Spring Boot.
@Configuration
@EnableJpaRepositories(basePackages = "com.example.repository")
public class AppConfig {
}
#Java #Training #Spring #OneToOne #ManyToMany #JoinColumn #Lob #Query #Modifying #EnableJpaRepositories
Аннотация @JoinColumn
Аннотация @JoinColumn используется в Java Persistence API (JPA) для указания столбца в базе данных, который является внешним ключом (foreign key) и связывает текущую сущность с другой сущностью. Она находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE). Эта аннотация применяется к полям или свойствам сущности, которые представляют собой связи между таблицами, такие как @OneToOne, @OneToMany, @ManyToOne и @ManyToMany.
Аннотация @JoinColumn принимает несколько параметров, которые позволяют настроить маппинг внешнего ключа:
name (тип: String):
Указывает имя столбца в базе данных, который будет использоваться как внешний ключ.
По умолчанию: если параметр не указан, JPA использует имя поля или свойства сущности, дополненное суффиксом _id (например, user_id).
referencedColumnName (тип: String):
Указывает имя столбца в целевой таблице (таблице, на которую ссылается внешний ключ).
По умолчанию: если параметр не указан, JPA использует первичный ключ целевой таблицы.
unique (тип: boolean):
Указывает, должен ли внешний ключ быть уникальным.
По умолчанию: false.
nullable (тип: boolean):
Указывает, может ли внешний ключ иметь значение NULL.
По умолчанию: true.
insertable (тип: boolean):
Указывает, должен ли столбец включаться в SQL-запросы INSERT.
По умолчанию: true.
updatable (тип: boolean):
Указывает, должен ли столбец включаться в SQL-запросы UPDATE.
По умолчанию: true.
columnDefinition (тип: String):
Позволяет указать SQL-определение столбца, которое будет использоваться при генерации схемы базы данных.
По умолчанию: не задано.
table (тип: String):
Указывает таблицу, в которой находится столбец (если сущность маппится на несколько таблиц).
По умолчанию: основная таблица сущности.
foreignKey (тип: ForeignKey):
Позволяет указать определение внешнего ключа для генерации схемы базы данных.
По умолчанию: не задано.
Пример использования:
Значения по умолчанию
Если аннотация @JoinColumn не указана, JPA использует имя поля или свойства сущности, дополненное суффиксом _id, в качестве имени столбца внешнего ключа.
Жизненный цикл
Применение: Аннотация @JoinColumn применяется на этапе маппинга сущности JPA. Она используется при создании таблиц в базе данных (если используется автоматическая генерация схемы) и при выполнении операций чтения/записи данных.
Инициализация: При загрузке сущности из базы данных JPA использует указанные параметры для маппинга внешнего ключа.
Уничтожение: При сохранении сущности в базу данных JPA использует указанные параметры для генерации SQL-запросов.
Варианты настройки
Использование name и referencedColumnName:
Позволяет явно указать имена столбцов в базе данных, что полезно при работе с существующими схемами.
Использование nullable:
Позволяет контролировать, может ли внешний ключ быть NULL. Например, для обязательных связей можно установить nullable = false.
Использование foreignKey:
Позволяет задать имя и другие параметры внешнего ключа, что полезно для управления схемой базы данных.
Кастомизация через columnDefinition:
Позволяет указать точное SQL-определение столбца, что полезно для сложных сценариев.
#Java #Training #Hard #Spring #SpringDataJPA #JoinColumn
Аннотация @JoinColumn используется в Java Persistence API (JPA) для указания столбца в базе данных, который является внешним ключом (foreign key) и связывает текущую сущность с другой сущностью. Она находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE). Эта аннотация применяется к полям или свойствам сущности, которые представляют собой связи между таблицами, такие как @OneToOne, @OneToMany, @ManyToOne и @ManyToMany.
Аннотация @JoinColumn принимает несколько параметров, которые позволяют настроить маппинг внешнего ключа:
name (тип: String):
Указывает имя столбца в базе данных, который будет использоваться как внешний ключ.
По умолчанию: если параметр не указан, JPA использует имя поля или свойства сущности, дополненное суффиксом _id (например, user_id).
referencedColumnName (тип: String):
Указывает имя столбца в целевой таблице (таблице, на которую ссылается внешний ключ).
По умолчанию: если параметр не указан, JPA использует первичный ключ целевой таблицы.
unique (тип: boolean):
Указывает, должен ли внешний ключ быть уникальным.
По умолчанию: false.
nullable (тип: boolean):
Указывает, может ли внешний ключ иметь значение NULL.
По умолчанию: true.
insertable (тип: boolean):
Указывает, должен ли столбец включаться в SQL-запросы INSERT.
По умолчанию: true.
updatable (тип: boolean):
Указывает, должен ли столбец включаться в SQL-запросы UPDATE.
По умолчанию: true.
columnDefinition (тип: String):
Позволяет указать SQL-определение столбца, которое будет использоваться при генерации схемы базы данных.
По умолчанию: не задано.
table (тип: String):
Указывает таблицу, в которой находится столбец (если сущность маппится на несколько таблиц).
По умолчанию: основная таблица сущности.
foreignKey (тип: ForeignKey):
Позволяет указать определение внешнего ключа для генерации схемы базы данных.
По умолчанию: не задано.
Пример использования:
@ManyToOne
@JoinColumn(name = "user_id", referencedColumnName = "id", nullable = false)
private User user;
Значения по умолчанию
Если аннотация @JoinColumn не указана, JPA использует имя поля или свойства сущности, дополненное суффиксом _id, в качестве имени столбца внешнего ключа.
Жизненный цикл
Применение: Аннотация @JoinColumn применяется на этапе маппинга сущности JPA. Она используется при создании таблиц в базе данных (если используется автоматическая генерация схемы) и при выполнении операций чтения/записи данных.
Инициализация: При загрузке сущности из базы данных JPA использует указанные параметры для маппинга внешнего ключа.
Уничтожение: При сохранении сущности в базу данных JPA использует указанные параметры для генерации SQL-запросов.
Варианты настройки
Использование name и referencedColumnName:
Позволяет явно указать имена столбцов в базе данных, что полезно при работе с существующими схемами.
Использование nullable:
Позволяет контролировать, может ли внешний ключ быть NULL. Например, для обязательных связей можно установить nullable = false.
Использование foreignKey:
Позволяет задать имя и другие параметры внешнего ключа, что полезно для управления схемой базы данных.
Кастомизация через columnDefinition:
Позволяет указать точное SQL-определение столбца, что полезно для сложных сценариев.
#Java #Training #Hard #Spring #SpringDataJPA #JoinColumn