Усечение строки в классе @Entity предотвращает исключение SQL при вставке длинной строки.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Усечение строки в классе @Entity предотвращает исключение SQL при вставке длинной строки.

Сообщение 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;

}


Подробнее здесь: https://stackoverflow.com/questions/798 ... rting-a-lo
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»