Java for Beginner
672 subscribers
540 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотации JPA: @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: Указывает класс целевой сущности (если он не может быть выведен из типа поля).

Пример:
@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