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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Вопросы с собеседования 👩‍💻

Какой метод используется для преобразования строки в верхний регистр?
Anonymous Quiz
7%
toLowerCase()
82%
toUpperCase()
7%
toUpper()
4%
convertToUpper()
#Mems. Ночью +100 к продуктивности.
Аннотация @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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотация @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
Что выведет код?

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
Варианты ответа:
Anonymous Quiz
6%
Bark
9%
Sleeping...
66%
Bark и Sleeping...
19%
RuntimeException
Сразу видно что джун работает только за еду 😂

https://t.me/Java_for_beginner_dev

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

Какой модификатор доступа позволяет видеть поле только внутри класса?
Anonymous Quiz
9%
public
4%
protected
86%
private
2%
default
Аннотация @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
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотация @Access

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

Аннотация @Access принимает один параметр — value, который определяет тип доступа. Параметр value может принимать одно из двух значений:

AccessType.FIELD:
JPA будет напрямую обращаться к полям сущности, используя reflection.
Аннотации маппинга (например, @Id, @Column) должны быть применены к полям.

AccessType.PROPERTY:
JPA будет использовать методы-геттеры и сеттеры для доступа к данным.
Аннотации маппинга должны быть применены к методам-геттерам.


Пример использования:
@Entity
@Access(AccessType.FIELD)
public class User {
@Id
private Long id;

private String name;
}


Если аннотация
@Access не указана, JPA определяет тип доступа на основе расположения аннотации @Id:
Если @Id находится на поле, используется AccessType.FIELD.
Если @Id находится на методе-геттере, используется
AccessType.PROPERTY.

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

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


Кастомизация доступа:

Если требуется смешанный доступ (например, доступ к полям для одних атрибутов и доступ через методы для других), можно использовать @Access на уровне класса и на уровне отдельных полей/методов.

Пример смешанного доступа:
@Entity
@Access(AccessType.FIELD)
public class User {
@Id
private Long id;

private String name;

@Access(AccessType.PROPERTY)
public String getFullName() {
return this.name.toUpperCase();
}

public void setFullName(String fullName) {
this.name = fullName.toLowerCase();
}
}


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

Использование AccessType.FIELD:
Подходит для случаев, когда требуется прямой доступ к полям.
Упрощает код, так как не требуется писать методы-геттеры и сеттеры.


Использование AccessType.PROPERTY:
Подходит для случаев, когда требуется дополнительная логика при получении или установке значений (например, валидация или преобразование данных).
Удобно для инкапсуляции логики доступа к данным.


Смешанный доступ:

Позволяет гибко настраивать доступ к данным, используя AccessType.FIELD для одних атрибутов и AccessType.PROPERTY для других.

#Java #Training #Hard #Spring #SpringDataJPA #Access
Что выведет код?

import java.math.BigDecimal;

public class Task070325 {
public static void main(String[] args) {
int a = 5;
double b = 10.5;
float c = 3.5f;
BigDecimal d = new BigDecimal("3.5");
int e = (int) (a + b + c + d);
System.out.println(e);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
18%
22
21%
23
15%
23.5
46%
Ошибка компиляции
Оптимизация процессов в действии 🤪

https://t.me/Java_for_beginner_dev

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

Какой цикл используется для перебора элементов массива неизвестной длины?
Anonymous Quiz
0%
switch
43%
while
15%
do-while
43%
for
Аннотации @AttributeOverride и @AttributeOverrides

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

@AttributeOverride: Используется для переопределения маппинга одного атрибута.
@AttributeOverrides: Используется для переопределения маппинга нескольких атрибутов.

@AttributeOverride
Аннотация @AttributeOverride принимает два параметра:
name: Имя атрибута встроенного объекта, маппинг которого нужно переопределить.
column: Аннотация
@Column, которая определяет новый маппинг для атрибута.

Пример использования:
@Embedded
@AttributeOverride(name = "street", column = @Column(name = "home_street"))
private Address address;


@AttributeOverrides
Аннотация @AttributeOverrides принимает массив из @AttributeOverride и используется для переопределения маппинга нескольких атрибутов.

Пример использования:
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "street", column = @Column(name = "home_street")),
@AttributeOverride(name = "city", column = @Column(name = "home_city"))
})
private Address address;


Если аннотации @AttributeOverride или @AttributeOverrides не указаны, JPA использует маппинг, определенный во встроенном классе.

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

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


Кастомизация маппинга:

Если требуется более сложная кастомизация маппинга, можно использовать аннотацию @Embeddable для определения встроенных объектов и @AttributeOverride для их переопределения.

Пример использования:

@Embeddable
public class Address {
private String street;
private String city;
}

@Entity
public class User {
@Id
private Long id;

@Embedded
@AttributeOverrides({
@AttributeOverride(name = "street", column = @Column(name = "home_street")),
@AttributeOverride(name = "city", column = @Column(name = "home_city"))
})
private Address homeAddress;

@Embedded
@AttributeOverrides({
@AttributeOverride(name = "street", column = @Column(name = "work_street")),
@AttributeOverride(name = "city", column = @Column(name = "work_city"))
})
private Address workAddress;
}


#Java #Training #Hard #Spring #SpringDataJPA #AttributeOverrides #AttributeOverride
Всем привет!

Уважаемые девушки, которые есть в нашем канале -
с 8 Марта Вас!
💐

Желаю Вам всегда оставаться обворожительными и желанными, чтобы все Ваши программы компилировались без ошибок, а баги фиксились сами 😍

А нам мужики, нужно сегодня порадовать свои вторые половинки, написать им самое лучшее приложение которое будет по шедулеру раз в 10 минут генерировать и отправлять им уникальные комплименты
🏝

Всем хорошего солнечного дня!
😊
Please open Telegram to view this post
VIEW IN TELEGRAM