Аннотации 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
Аннотация @OneToOne
Аннотация @OneToOne используется в Java Persistence API (JPA) для обозначения отношения "один к одному" между двумя сущностями. Она указывает, что одна сущность связана с другой сущностью через уникальное отношение. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @OneToOne принимает несколько параметров для настройки отношения:
targetEntity: Указывает класс целевой сущности (если он не может быть выведен из типа поля).
Пример:
cascade: Определяет каскадные операции, которые должны быть применены к связанной сущности.
Возможные значения: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.ALL.
Пример:
fetch: Определяет стратегию загрузки связанной сущности.
Возможные значения: FetchType.EAGER (загрузка сразу) или FetchType.LAZY (ленивая загрузка).
Пример:
optional:Указывает, может ли связанная сущность быть null.
По умолчанию: true.
Пример:
mappedBy: Указывает поле в целевой сущности, которое управляет отношением (используется на стороне, которая не владеет отношением).
Пример:
orphanRemoval: Указывает, должна ли связанная сущность быть удалена при удалении её из коллекции или установке в null.
По умолчанию: false.
Пример:
Если параметры не указаны, используются значения по умолчанию:
fetch = FetchType.EAGER
optional = true
orphanRemoval = false
Жизненный цикл
Применение: Аннотация @OneToOne применяется на этапе маппинга сущностей JPA. Она указывает, что между двумя сущностями существует отношение "один к одному".
Инициализация: При загрузке сущности из базы данных JPA загружает связанную сущность в зависимости от стратегии загрузки (EAGER или LAZY).
Уничтожение: При удалении сущности JPA учитывает каскадные операции и параметр orphanRemoval.
Ленивая загрузка (Lazy Loading):
Spring Boot поддерживает ленивую загрузку через прокси-объекты Hibernate. Для этого необходимо включить поддержку прокси в настройках:
Интеграция с репозиториями:
Spring Data JPA предоставляет репозитории для работы с сущностями. Отношения @OneToOne могут быть использованы в репозиториях как обычные поля.
Пример репозитория:
Варианты настройки
Одностороннее отношение:
Отношение управляется одной из сущностей. Пример:
Двустороннее отношение:
Отношение управляется обеими сущностями. Пример:
Каскадные операции:
Используются для автоматического применения операций к связанной сущности. Пример:
Ленивая загрузка:
Используется для оптимизации производительности. Пример:
#Java #Training #Hard #Spring #SpringDataJPA #OneToOne
Аннотация @OneToOne используется в Java Persistence API (JPA) для обозначения отношения "один к одному" между двумя сущностями. Она указывает, что одна сущность связана с другой сущностью через уникальное отношение. Аннотация находится в пакете javax.persistence (или jakarta.persistence в Jakarta EE).
Аннотация @OneToOne принимает несколько параметров для настройки отношения:
targetEntity: Указывает класс целевой сущности (если он не может быть выведен из типа поля).
Пример:
@OneToOne(targetEntity = Address.class)
private Address address;
cascade: Определяет каскадные операции, которые должны быть применены к связанной сущности.
Возможные значения: CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REMOVE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.ALL.
Пример:
@OneToOne(cascade = CascadeType.ALL)
private Address address;
fetch: Определяет стратегию загрузки связанной сущности.
Возможные значения: FetchType.EAGER (загрузка сразу) или FetchType.LAZY (ленивая загрузка).
Пример:
@OneToOne(fetch = FetchType.LAZY)
private Address address;
optional:Указывает, может ли связанная сущность быть null.
По умолчанию: true.
Пример:
@OneToOne(optional = false)
private Address address;
mappedBy: Указывает поле в целевой сущности, которое управляет отношением (используется на стороне, которая не владеет отношением).
Пример:
@OneToOne(mappedBy = "user")
private Profile profile;
orphanRemoval: Указывает, должна ли связанная сущность быть удалена при удалении её из коллекции или установке в null.
По умолчанию: false.
Пример:
@OneToOne(orphanRemoval = true)
private Address address;
Если параметры не указаны, используются значения по умолчанию:
fetch = FetchType.EAGER
optional = true
orphanRemoval = false
Жизненный цикл
Применение: Аннотация @OneToOne применяется на этапе маппинга сущностей JPA. Она указывает, что между двумя сущностями существует отношение "один к одному".
Инициализация: При загрузке сущности из базы данных JPA загружает связанную сущность в зависимости от стратегии загрузки (EAGER или LAZY).
Уничтожение: При удалении сущности JPA учитывает каскадные операции и параметр orphanRemoval.
Ленивая загрузка (Lazy Loading):
Spring Boot поддерживает ленивую загрузку через прокси-объекты Hibernate. Для этого необходимо включить поддержку прокси в настройках:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
Интеграция с репозиториями:
Spring Data JPA предоставляет репозитории для работы с сущностями. Отношения @OneToOne могут быть использованы в репозиториях как обычные поля.
Пример репозитория:
public interface UserRepository extends JpaRepository<User, Long> {
}
Варианты настройки
Одностороннее отношение:
Отношение управляется одной из сущностей. Пример:
@Entity
public class User {
@OneToOne
private Address address;
}
Двустороннее отношение:
Отношение управляется обеими сущностями. Пример:
@Entity
public class User {
@OneToOne(mappedBy = "user")
private Profile profile;
}
@Entity
public class Profile {
@OneToOne
@JoinColumn(name = "user_id")
private User user;
}
Каскадные операции:
Используются для автоматического применения операций к связанной сущности. Пример:
@OneToOne(cascade = CascadeType.ALL)
private Address address;
Ленивая загрузка:
Используется для оптимизации производительности. Пример:
@OneToOne(fetch = FetchType.LAZY)
private Address address;
#Java #Training #Hard #Spring #SpringDataJPA #OneToOne