На эту тему неоднократно отвечали здесь и там, но ни одно из предложенных решений не выглядит элегантно и требует слишком много шаблонного кода + работы для добавления предлагаемых решений в ваш проект.
Мое решение работает нормально и автоматически на основе определения длины аннотации @Column: @Column(name = "address", length = 50), но для этого требуется добавить две аннотации в ваш класс @Entity.
Интересно, существует ли официальная библиотека Java, которая может решить эту проблему с нулевым кодом и требует добавления только одной аннотации в мой проект.
Я использую Mapstruct и Lombok.
Mapstruct преобразует мои POJO (поступающие из REST) в сущности, поэтому решение, которое сокращает значение строковых переменных в сущности во время преобразования Mapstruct, также может подойти мне. К сожалению, мне не удалось найти простое решение для Mapstruct.
Другое решение, которое пришло на ум, — каким-то образом изменить аннотацию Lombok @Setter, чтобы обрезать содержимое строки при вызове методов set. Однако удобного и простого решения для реализации этого я не нашел. Кроме того, POJO не знают максимальную длину строк, она известна только в классах, аннотированных @Entity и @Column.
Это мое решение, которое требует добавления двух аннотаций, но я хочу заменить ее «официальной» библиотекой, если она существует:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Shorten {
int length() default 255;
}
Реализация:
import jakarta.persistence.Column;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import java.util.Objects;
public class StringShortenerListener {
@PrePersist
@PreUpdate
public void shortenStrings(Object entity) {
for (var field : entity.getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(Shorten.class)) {
field.setAccessible(true);
try {
Column columnAnnotation = field.getAnnotation(Column.class);
int maxLength = field.getDeclaredAnnotation(Column.class).length();
if (Objects.nonNull(columnAnnotation)) {
int length = columnAnnotation.length();
if (length > 0) {
// the length attribute exists in the @Column annotation
String value = (String) field.get(entity);
if (value != null && value.length() > maxLength) {
field.set(entity, value.substring(0, maxLength));
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
Использование:
@Entity
@EntityListeners(StringShortenerListener.class)
@Table(name = "customer")
@Data
public class CustomerEntity {
@Column(name = "name", length = 48, nullable = false)
@Shorten
private String name;
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... rting-a-lo
Усечение строки в классе @Entity предотвращает исключение SQL при вставке длинной строки. ⇐ JAVA
Программисты JAVA общаются здесь
1769267531
Anonymous
На эту тему неоднократно отвечали здесь и там, но ни одно из предложенных решений не выглядит элегантно и требует слишком много шаблонного кода + работы для добавления предлагаемых решений в ваш проект.
Мое решение работает нормально и автоматически на основе определения длины аннотации @Column: @Column(name = "address", length = 50), но для этого требуется добавить две аннотации в ваш класс @Entity.
Интересно, существует ли официальная библиотека Java, которая может решить эту проблему с нулевым кодом и требует добавления только одной аннотации в мой проект.
Я использую Mapstruct и Lombok.
Mapstruct преобразует мои POJO (поступающие из REST) в сущности, поэтому решение, которое сокращает значение строковых переменных в сущности во время преобразования Mapstruct, также может подойти мне. К сожалению, мне не удалось найти простое решение для Mapstruct.
Другое решение, которое пришло на ум, — каким-то образом изменить аннотацию Lombok @Setter, чтобы обрезать содержимое строки при вызове методов set. Однако удобного и простого решения для реализации этого я не нашел. Кроме того, POJO не знают максимальную длину строк, она известна только в классах, аннотированных @Entity и @Column.
Это мое решение, которое требует добавления двух аннотаций, но я хочу заменить ее «официальной» библиотекой, если она существует:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Shorten {
int length() default 255;
}
Реализация:
import jakarta.persistence.Column;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import java.util.Objects;
public class StringShortenerListener {
@PrePersist
@PreUpdate
public void shortenStrings(Object entity) {
for (var field : entity.getClass().getDeclaredFields()) {
if (field.isAnnotationPresent(Shorten.class)) {
field.setAccessible(true);
try {
Column columnAnnotation = field.getAnnotation(Column.class);
int maxLength = field.getDeclaredAnnotation(Column.class).length();
if (Objects.nonNull(columnAnnotation)) {
int length = columnAnnotation.length();
if (length > 0) {
// the length attribute exists in the @Column annotation
String value = (String) field.get(entity);
if (value != null && value.length() > maxLength) {
field.set(entity, value.substring(0, maxLength));
}
}
}
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
Использование:
@Entity
@EntityListeners(StringShortenerListener.class)
@Table(name = "customer")
@Data
public class CustomerEntity {
@Column(name = "name", length = 48, nullable = false)
@Shorten
private String name;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79875193/turncate-string-in-an-entity-class-prevents-a-sql-exception-when-inserting-a-lo[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия