Java for Beginner
679 subscribers
577 photos
158 videos
12 files
876 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
Аннотация @Lob

Аннотация @Lob (Large Object) используется в Java Persistence API (JPA) для маппинга (отображения) больших объектов данных, таких как большие текстовые поля (CLOB) или бинарные данные (BLOB), на соответствующие типы данных в базе данных. Она находится в пакете javax.persistence (или jakarta.persistence, если используется Jakarta EE). Эта аннотация применяется к полям или свойствам сущности, которые представляют большие объекты.

Аннотация @Lob не принимает параметров. Она используется как маркер для указания, что поле должно быть маппировано как большой объект. Тип поля определяет, будет ли это CLOB (Character Large Object) или BLOB (Binary Large Object):

Для текстовых данных:

Если поле имеет тип String или char[], оно будет маппировано как CLOB.

Для бинарных данных:

Если поле имеет тип byte[] или Byte[], оно будет маппировано как BLOB.


Для сериализованных объектов:
Если поле имеет тип, реализующий Serializable, оно также может быть маппировано как BLOB.

Если аннотация @Lob не указана, JPA будет использовать стандартные типы данных для маппинга полей (например, VARCHAR для String или VARBINARY для byte[]), что может привести к ограничениям на размер данных.

Жизненный цикл

Применение: Аннотация @Lob применяется на этапе маппинга сущности JPA. Она используется при создании таблиц в базе данных (если используется автоматическая генерация схемы) и при выполнении операций чтения/записи данных.
Инициализация: При загрузке сущности из базы данных JPA использует указанный тип большого объекта (CLOB или BLOB) для преобразования данных в соответствующий тип Java.
Уничтожение: При сохранении сущности в базу данных JPA преобразует значение большого объекта Java в соответствующий тип данных базы данных (CLOB или BLOB).


Механизмы Spring и настройки Spring Boot

Механизмы Spring
JPA и Hibernate: Spring Data JPA использует провайдеров JPA (например, Hibernate) для работы с базой данных. Аннотация @Lob обрабатывается на уровне JPA, но Spring обеспечивает интеграцию с JPA через EntityManager и репозитории.
Маппинг сущностей: Spring Data JPA автоматически маппит сущности на таблицы базы данных, используя аннотации JPA, включая @Lob.

Настройки Spring Boot
Spring Boot упрощает настройку JPA через свойства конфигурации. Вот несколько ключевых настроек, которые могут влиять на работу @Lob:

Генерация схемы базы данных:
Если используется автоматическая генерация схемы (например, через Hibernate), Spring Boot настраивает это через свойство:

spring.jpa.hibernate.ddl-auto=update


В этом случае Hibernate создаст столбец для большого объекта с типом данных, соответствующим CLOB или BLOB.

Настройки Hibernate:
Spring Boot позволяет настраивать Hibernate через свойства, например:

spring.jpa.properties.hibernate.format_sql=true
Эти настройки не влияют напрямую на @Lob, но могут помочь в отладке SQL-запросов, связанных с маппингом больших объектов.


Использование @Column для уточнения размера:
Для больших текстовых полей можно использовать аннотацию @Column с параметром length, чтобы указать максимальный размер:

@Lob
@Column(length = 1000000)
private String largeText;


Использование @Basic для ленивой загрузки:
Для оптимизации производительности можно использовать аннотацию @Basic с параметром fetch = FetchType.LAZY, чтобы загружать большие объекты только при необходимости:
@Lob
@Basic(fetch = FetchType.LAZY)
private byte[] largeBinaryData;


#Java #Training #Hard #Spring #SpringDataJPA #Lob