Shaun Abram
Java and Technology weblog
Persisting Money class with Hibernate
Further to my previous post about representing monetary amounts in Java, I have been using the TimeAndMoney library.
I ran into some problems persisting my classes that use Money via Hibernate. I should point out that these are not problems with the Money class or the timeandmoney library, rather than with my hibernate setup, but I thought I would post my approach here for future reference.
I started by incorrectly trying to map my Money field (in my case, called ‘openingBalance) as a property, viz:
<property name=”openingBalance” type=”com.domainlanguage.money.Money”>
Which resulted in the following error:
SEVERE: Data truncation: Data too long for column ‘openingBalance’ at row 1
Exception in thread “main” org.hibernate.exception.GenericJDBCException: could not insert…
Then I tried mapping it as a component, viz
<component name=”openingBalance” class=”com.domainlanguage.money.Money”>
<property name=”amount”/>
<property name=”currency”/>
</component>
But this resulted in the following error:
Initial SessionFactory creation failed.org.hibernate.PropertyNotFoundException: Could not find a setter for property amount in class com.domainlanguage.money.Money
Exception in thread “main” java.lang.ExceptionInInitializerError
This is because the Money class has no setAmount or setCurrency methods. The solution is to specify field access (as opposed to accessor method access), as in
<component name=”openingBalance” class=”com.domainlanguage.money.Money”>
<property access=”field” name=”amount”/>
<property access=”field” name=”currency”/>
</component>
Note that if you check the Money javadocs, it (correctly) says that the setters are not provided because they would break encapsulation They do however (and I quote, “begrudgingly”) provide alternative setters such as setForPersistentMapping_Amount, but I am not sure how to get Hibernate to use these, and in this case, I don’t think it is necessary or beneficial anyway.
Tags: Hibernate, money, timeandmoney
Subscribe to RSS Feed