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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Аннотация @Transient

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

Аннотация @Transient не принимает никаких параметров. Она просто маркирует поле или свойство как не сохраняемое в базе данных.

Настройки и значения

Поскольку @Transient не имеет параметров, её настройка ограничивается выбором поля или свойства, которое не должно быть сохранено в базе данных.
Поле, помеченное
@Transient, игнорируется JPA-провайдером (например, Hibernate) при выполнении операций с базой данных, таких как INSERT, UPDATE, SELECT и DELETE.

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

Аннотация @Transient применяется на этапе загрузки метаданных сущности (во время инициализации контекста Spring или при развертывании приложения).

Поле, помеченное @Transient, не участвует в:
Создании схемы базы данных (если используется автоматическое создание таблиц).
Генерации SQL-запросов.
Валидации данных.


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

Механизмы Spring, связанные с @Transient
Spring Data JPA использует аннотацию @Transient для интеграции с JPA-провайдером (например, Hibernate).
При старте приложения Spring Boot автоматически сканирует сущности, помеченные аннотацией
@Entity, и анализирует их поля, включая те, что помечены @Transient.
Spring Boot настраивает EntityManagerFactory и DataSource, которые используются JPA для работы с базой данных.


Настройки Spring Boot, предшествующие работе @Transient
Конфигурация источника данных (DataSource):
Spring Boot автоматически настраивает DataSource на основе свойств, указанных в application.properties или application.yml.

Например:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Эти настройки необходимы для подключения к базе данных, где хранятся сущности.


Конфигурация JPA:
Spring Boot автоматически настраивает JPA через свойства, такие как:
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
Свойство spring.jpa.hibernate.ddl-auto управляет созданием и обновлением схемы базы данных.


Обработка значений @Transient
Поле, помеченное @Transient, игнорируется JPA-провайдером при выполнении операций с базой данных.
Значение поля может быть установлено и использовано в коде приложения, но оно не будет сохранено в базе данных.


Варианты настройки

Использование @Transient для вычисляемых полей:
@Transient
private int age;

public int getAge() {
return Period.between(birthDate, LocalDate.now()).getYears();
}


В этом примере поле age вычисляется на основе даты рождения и не сохраняется в базе данных.

Использование @Transient для временных данных:
@Transient
private String temporaryData;
В этом примере поле temporaryData используется для временного хранения данных в объекте.


#Java #Training #Hard #Spring #SpringDataJPA #Transient
👍3
📌 Факт дня

А вы знали, что Bluetooth назван в честь короля?

Технология получила имя в честь датского короля Харальда Синезубого (Harald Bluetooth), который объединил племена в X веке — символ объединения устройств.


Proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🤯1🫡1
Аннотация @Enumerated

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

Аннотация @Enumerated принимает один параметр — value, который определяет тип маппинга перечисления.

Параметр value может принимать одно из двух значений:

EnumType.ORDINAL:
Перечисление сохраняется в базе данных как целое число (индекс значения перечисления).
Например, если у вас есть перечисление Status { ACTIVE, INACTIVE, PENDING }, то ACTIVE будет сохранено как 0, INACTIVE — как 1, PENDING — как 2.
Недостаток: если порядок значений в перечислении изменится, это может привести к ошибкам в данных.


EnumType.STRING:
Перечисление сохраняется в базе данных как строка (имя значения перечисления).
Например, ACTIVE будет сохранено как строка "ACTIVE".
Преимущество: такой подход более устойчив к изменениям в перечислении, так как не зависит от порядка значений.


Пример использования:
@Enumerated(EnumType.STRING)
private Status status;


Если аннотация @Enumerated не указана, JPA по умолчанию использует EnumType.ORDINAL.

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

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


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

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

#Java #Training #Hard #Spring #SpringDataJPA #Enumerated
👍2
Настройки Spring Boot

Spring Boot упрощает настройку JPA через свойства конфигурации. Вот несколько ключевых настроек, которые могут влиять на работу @Enumerated:
Если используется автоматическая генерация схемы (например, через Hibernate), Spring Boot настраивает это через свойство:
spring.jpa.hibernate.ddl-auto=update


В этом случае Hibernate создаст столбец для перечисления с типом данных, соответствующим EnumType (например, INT для ORDINAL или VARCHAR для STRING).

Настройки Hibernate:
Spring Boot позволяет настраивать Hibernate через свойства, например:
spring.jpa.properties.hibernate.format_sql=true

Эти настройки не влияют напрямую на @Enumerated, но могут помочь в отладке SQL-запросов, связанных с маппингом перечислений.

Кастомизация маппинга:
Если требуется кастомизировать маппинг перечислений (например, использовать собственные преобразователи), можно использовать аннотацию @Converter или реализовать интерфейс AttributeConverter.

Пример кастомизации через @Converter:
@Converter(autoApply = true)
public class StatusConverter implements AttributeConverter<Status, String> {
@Override
public String convertToDatabaseColumn(Status status) {
return status.name().toLowerCase();
}

@Override
public Status convertToEntityAttribute(String dbData) {
return Status.valueOf(dbData.toUpperCase());
}
}


Варианты настройки

Использование EnumType.ORDINAL:
Подходит для случаев, когда порядок значений перечисления фиксирован и не будет изменяться.
Экономит место в базе данных, так как хранится как число.


Использование EnumType.STRING:

Рекомендуется для случаев, когда порядок значений перечисления может измениться.
Удобно для чтения данных напрямую из базы данных, так как значения хранятся в виде строк.


Кастомизация через @Converter:
Позволяет гибко настраивать маппинг перечислений, например, сохранять значения в нижнем регистре или использовать собственные форматы.

#Java #Training #Hard #Spring #SpringDataJPA #Enumerated
👍1
Что выведет код?

public class Task050325 {
public static void main(String[] args) {
String text = "apple, banana; cherry grape";
String[] parts = text.split("[,; ]");
System.out.println(parts.length);
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
32%
3
45%
4
6%
5
16%
6
👍1
👍3💯1
И обычно в этот момент QA зовет разработчика, а сам сваливает 🤪🫡

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Вопросы с собеседования 👩‍💻

Какой метод используется для преобразования строки в верхний регистр?
Anonymous Quiz
7%
toLowerCase()
82%
toUpperCase()
7%
toUpper()
4%
convertToUpper()
👍2
#Mems. Ночью +100 к продуктивности.
🔥4
Аннотация @Temporal

Аннотация @Temporal используется в Java Persistence API (JPA) для указания способа маппинга (отображения) временных типов данных (например, java.util.Date или java.util.Calendar) на соответствующие типы данных в базе данных. Она находится в пакете javax.persistence (или jakarta.persistence, если используется Jakarta EE). Эта аннотация применяется к полям или свойствам сущности, которые представляют дату или время.

Аннотация @Temporal принимает один параметр — value, который определяет тип временных данных, сохраняемых в базе данных.

Параметр value может принимать одно из следующих значений:

TemporalType.DATE:
Сохраняет только дату (год, месяц, день) без времени.
В базе данных это обычно маппится на тип DATE.


TemporalType.TIME:
Сохраняет только время (часы, минуты, секунды) без даты.
В базе данных это обычно маппится на тип TIME.


TemporalType.TIMESTAMP:
Сохраняет и дату, и время.
В базе данных это обычно маппится на тип TIMESTAMP.


Пример использования:
@Temporal(TemporalType.DATE)
private Date birthDate;

@Temporal(TemporalType.TIMESTAMP)
private Date lastUpdated;


Если аннотация @Temporal не указана, JPA по умолчанию использует TemporalType.TIMESTAMP для полей типа java.util.Date и java.util.Calendar.

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

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


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

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

Настройки Spring Boot

Spring Boot упрощает настройку JPA через свойства конфигурации.

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


spring.jpa.hibernate.ddl-auto=update


В этом случае Hibernate создаст столбец для временного типа с типом данных, соответствующим TemporalType (например, DATE, TIME или TIMESTAMP).

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

spring.jpa.properties.hibernate.format_sql=true


Эти настройки не влияют напрямую на @Temporal, но могут помочь в отладке SQL-запросов, связанных с маппингом временных типов.

Использование java.time (JSR-310):
Начиная с Java 8, рекомендуется использовать типы из пакета java.time (например, LocalDate, LocalTime, LocalDateTime), которые не требуют аннотации @Temporal. Spring Data JPA и Hibernate автоматически маппят эти типы на соответствующие типы базы данных.

Пример использования java.time:
private LocalDate birthDate;
private LocalDateTime lastUpdated;


Варианты настройки

Использование java.time:
Рекомендуется для новых приложений, так как типы java.time более современны и не требуют аннотации @Temporal.

#Java #Training #Hard #Spring #SpringDataJPA #Temporal
📌 Факт дня:

А вы знали, что название "Python" связано с комедией?

Язык программирования Python был назван Гвидо ван Россумом в честь британского комедийного шоу "Летающий цирк Монти Пайтона", а не в честь змеи, как многие думают.


Proof

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Аннотация @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
👍1
Что выведет код?

abstract class Animal0603 {
abstract void sound();

void sleep() {
System.out.println("Sleeping...");
}
}

class Dog0603 extends Animal0603 {
void sound() {
System.out.println("Bark");
}
}

public class Task060325 {
public static void main(String[] args) {
Animal0603 animal = new Dog0603();
animal.sound();
animal.sleep();
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
6%
Bark
9%
Sleeping...
66%
Bark и Sleeping...
19%
RuntimeException
👍1
Сразу видно что джун работает только за еду 😂

https://t.me/Java_for_beginner_dev

#Mems
Please open Telegram to view this post
VIEW IN TELEGRAM
2🤔1
Вопросы с собеседования 👩‍💻

Какой модификатор доступа позволяет видеть поле только внутри класса?
Anonymous Quiz
9%
public
4%
protected
86%
private
2%
default
🔥1
Аннотация @Version

Аннотация @Version используется в Java Persistence API (JPA) для реализации оптимистичной блокировки (optimistic locking) в сущностях. Она находится в пакете javax.persistence (или jakarta.persistence, если используется Jakarta EE). Эта аннотация применяется к полю сущности, которое хранит версию записи. Поле с аннотацией @Version автоматически увеличивается при каждом обновлении сущности, что позволяет предотвратить проблемы, связанные с параллельными изменениями данных.

Аннотация @Version не принимает параметров. Она используется как маркер для указания поля, которое будет использоваться для хранения версии сущности.

Поле должно быть одного из следующих типов:
int
Integer
long
Long
short
Short
java.sql.Timestamp


Пример использования:
@Version
private int version;


При создании новой сущности значение поля с аннотацией @Version инициализируется как 0 (для числовых типов) или текущее время (для java.sql.Timestamp).
При каждом обновлении сущности значение поля автоматически увеличивается на 1 (для числовых типов) или обновляется до текущего времени (для java.sql.Timestamp).

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

Применение: Аннотация @Version применяется на этапе маппинга сущности JPA. Она используется при создании таблиц в базе данных (если используется автоматическая генерация схемы) и при выполнении операций чтения/записи данных.
Инициализация: При создании новой сущности значение поля инициализируется в соответствии с типом данных.
Обновление: При каждом обновлении сущности значение поля автоматически увеличивается или обновляется.
Проверка: При обновлении сущности JPA проверяет, что значение поля
@Version в базе данных совпадает с значением в сущности. Если значения не совпадают, выбрасывается исключение OptimisticLockException.

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

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

Настройки Spring Boot

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

Генерация схемы базы данных:
Если используется автоматическая генерация схемы (например, через Hibernate), Spring Boot настраивает это через свойство:
spring.jpa.hibernate.ddl-auto=update


В этом случае Hibernate создаст столбец для поля @Version с типом данных, соответствующим типу поля (например, INT для int или BIGINT для long).

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


Обработка исключений:
Spring Boot автоматически обрабатывает исключение OptimisticLockException, которое может быть выброшено при конфликте версий. Это исключение можно обработать в коде или через механизмы Spring (например, @ExceptionHandler).

Варианты настройки

Использование числовых типов:
Рекомендуется использовать int или long для поля @Version, так как это упрощает работу с версиями и уменьшает вероятность ошибок.

Использование java.sql.Timestamp:
Может быть полезно, если требуется использовать временные метки для контроля версий. Однако это менее предсказуемо, чем числовые типы.

Кастомизация обработки исключений:
Можно настроить обработку OptimisticLockException для предоставления пользователю информации о конфликте версий.

#Java #Training #Hard #Spring #SpringDataJPA #Version
👍2
📌 Факт дня:

А вы знали, что "SQL" придумали для простоты?

Язык запросов SQL (Structured Query Language) был разработан в 1970-х в IBM, чтобы даже непрограммисты могли работать с базами данных. Сегодня он — стандарт в IT.


Немного истории

#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1