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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Что выведет код?

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
Ребят!

Не очень удобно спрашивать, но если у кого есть премиум в телеграмме - проголосуйте за канал, чтобы я мог использовать больше возможностей!

Заранее всем спасибо! 🤝

https://t.me/boost/Java_for_beginner_dev
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Еще раз привет! 🖖

Хотел сказать, что если ничего вдруг не изменится, то завтра в 16:00 по МСК, я буду ждать Вас на встрече, в том же месте😄

Начнем создание приложения с подробного разбора создания сущности:

🔜 Узнаем что такое сущности и зачем они вообще нужны.
🔜 Пройдемся по основным свойствам и настройкам
🔜 Изучим на примере основные аннотации, пощупаем их в работе
🔜 Напишем мини-приложение в котором все это протестируем.

Жду всех. Как всегда 🧑‍💻
Please open Telegram to view this post
VIEW IN TELEGRAM