I often use AttributeConverter to convert external types I do not have control on such as joda-time/joda-money and which to do the same for composite types like time-intervals (start date + end date) or money (amount + currency).
Right now, AttributeConverter seems to be usable only for single-value attributes and not composite ones.
I propose to add the possibility to map any type on an @Embeddable type and use this @Embeddable as some kind of surrogate when persisting/reading data.
Example:
Imagine the immutable type Money(final BigDecimal amount, final Currency currency) and the following @Embeddable type:
@Embeddable
public class EmbeddableMoney {
private BigDecimal amount;
private Currency currency;
}
@Converter(autoApply = true)
public class MoneyConverter implements AttributeConverter<Money, EmbeddableMoney> {
@Override
public EmbeddableMoney convertToDatabaseColumn(Money attribute) {
if (attribute == null) {
return null;
}
EmbeddableMoney columns = new EmbeddableMoney();
columns.setAmount(attribute.getAmount());
columns.setCurrency(attribute.getCurrency());
return columns
}
@Override
public Money convertToEntityAttribute(EmbeddableMoney dbData) {
if (dbData == null) { return null;
}
return new Money(dbData.getAmount(), dbData.getCurrency());
}
}
@Converter(autoApply = true)
public class CurrencyConverter implements AttributeConverter<Currency, String> {
...
}
What do you think?
|