У меня есть следующий конвертер
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
@Converter(autoApply = true)
public class ImportedReasonConverter implements AttributeConverter<ImportedReason, String> {
@Override
public String convertToDatabaseColumn(final ImportedReason pImportedReason) {
return pImportedReason.getValue();
}
@Override
public ImportedReason convertToEntityAttribute(final String pImportedReason) {
return ImportedReason.of(pImportedReason);
}
}
, который используется такой сущностью, как
@Entity
@Table(
name = "IMPORT_RECORD"
)
public class ImportRecordEntity implements Serializable {
private static final long serialVersionUID = 2483327758356663412L;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ID")
private UUID id;
@Column(name = "importedReason")
private ImportedReason importedReason;
public ImportedReason getImportedReason() {
return importedReason;
}
public void setImportedReason(final ImportedReason importedReason) {
this.importedReason = importedReason;
}
{...}
}
При запуске приложения Hibernate создает таблицу, используя правильный столбец тип (здесь: VARCHAR). Удаление параметра autoApply = true приводит к ошибке запуска - поэтому сам конвертер распознается.
Но: при сохранении сущности со значением, установленным на importReason, я получаю
Caused by: java.io.NotSerializableException: ImportedReason
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1185)
at java.base/java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1553)
at java.base/java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1510)
at java.base/java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1433)
at java.base/java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1179)
at java.base/java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:349)
at org.hibernate.internal.util.SerializationHelper.serialize(SerializationHelper.java:115)
... 43 more
Попробуйте отладить мой конвертер, метод ImportedReasonConverter.convertToDatabaseColumn (ImportedReason) не вызывается. Поэтому Hibernate не пытается записать значение типа String, а типа ImportedReason.
Есть идеи, почему конвертер не используется должным образом? Я пробовал это с Java 8 + 11 и Spring 2.1.5.RELEASE + 2.1.9.RELEASE (более ранние версии использовались для работы с другим проектом). Я также пробовал это с некоторыми другими конвертерами (например, внутренний тип -> LocalDateTime), но у меня также есть та же проблема.
Большое спасибо. Stefan