public class JodaMoneyType implements CompositeUserType<Money> { @Override public Object getPropertyValue(Money component, int property) throws HibernateException { switch (property) { case 0: return component.getCurrencyUnit().getCode(); case 1: return component.getAmount(); default: throw new HibernateException("unknown property"); } } @Override public Money instantiate(ValueAccess values, SessionFactoryImplementor sessionFactory) { String currency = values.getValue(0, String.class); BigDecimal amount = values.getValue(1, BigDecimal.class); if (currency == null || amount == null) { return null; } return Money.of(CurrencyUnit.of(currency), amount); } @Override public Class<?> embeddable() { return Money.class; } @Override public Class<Money> returnedClass() { return Money.class; } @Override public boolean equals(Money x, Money y) { if (x == y) { return true; } if (x == null || y == null) { return false; } return x.equals(y); } @Override public int hashCode(Money x) { if (x == null) { return 0; } return x.hashCode(); } @Override public Money deepCopy(Money value) { if (value == null) { return null; } return Money.of(value.getCurrencyUnit(), value.getAmount()); } @Override public boolean isMutable() { return false; } @Override public Serializable disassemble(Money value) { return value; } @Override public Money assemble(Serializable cached, Object owner) { return cached == null ? null : (Money) cached; } @Override public Money replace(Money detached, Money managed, Object owner) { return detached; } }
@Entity(name = "Salary") @Table(name = "salary") @Datapublic static class Salary { @Id @GeneratedValue private Long id; private String other; @AttributeOverride(name = "amount", column = @Column(name = "salary_amount")) @AttributeOverride(name = "currency", column = @Column(name = "salary_currency")) @CompositeType(value = JodaMoneyType.class) private org.joda.money.Money salary;}
compositeType mapping salary cannot mapping two columns, only one .