Class JodaMoneyType

  • All Implemented Interfaces:
    org.hibernate.usertype.CompositeUserType

    public class JodaMoneyType
    extends java.lang.Object
    implements org.hibernate.usertype.CompositeUserType
    Defines JPA mapping for Joda Money type.

    Money is mapped to two table columns, a text currency column that stores the currency code, and a numeric amount column that stores the amount.

    The main purpose of this class is to normalize the amount loaded from the database. To support all currency types, the scale of the numeric column is set to 2. As a result, the BigDecimal instances obtained from query ResultSets all have their scale at 2. However, some currency types, e.g., JPY requires that the scale be zero. This class strips trailing zeros from each loaded BigDecimal, then calls the appropriate factory method for Money, which will adjust the scale appropriately.

    Although CompositeUserType is likely to suffer breaking change in Hibernate 6, it is the only option. The suggested alternatives such as Hibernate component or Java Embeddable do not work in this case. Hibernate component (our previous solution that is replaced by this class) does not allow manipulation of the loaded amount objects. Java Embeddable is not applicable since we do not own the Joda money classes.

    Usage:

    
     '@'Type(type = JodaMoneyType.TYPE_NAME)
     '@'Columns(
       columns = {
         '@'Column(name = "cost_amount"),
         '@'Column(name = "cost_currency")
       }
     )
     Money cost;
     
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static JodaMoneyType INSTANCE  
      static java.lang.String TYPE_NAME
      The name of this type registered with JPA.
    • Constructor Summary

      Constructors 
      Constructor Description
      JodaMoneyType()  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      java.lang.Object assemble​(java.io.Serializable cached, org.hibernate.engine.spi.SharedSessionContractImplementor session, java.lang.Object owner)  
      java.lang.Object deepCopy​(java.lang.Object value)  
      java.io.Serializable disassemble​(java.lang.Object value, org.hibernate.engine.spi.SharedSessionContractImplementor session)  
      boolean equals​(java.lang.Object x, java.lang.Object y)  
      java.lang.String[] getPropertyNames()  
      org.hibernate.type.Type[] getPropertyTypes()  
      java.lang.Object getPropertyValue​(java.lang.Object component, int property)  
      int hashCode​(java.lang.Object x)  
      boolean isMutable()  
      java.lang.Object nullSafeGet​(java.sql.ResultSet rs, java.lang.String[] names, org.hibernate.engine.spi.SharedSessionContractImplementor session, java.lang.Object owner)  
      void nullSafeSet​(java.sql.PreparedStatement st, java.lang.Object value, int index, org.hibernate.engine.spi.SharedSessionContractImplementor session)  
      java.lang.Object replace​(java.lang.Object original, java.lang.Object target, org.hibernate.engine.spi.SharedSessionContractImplementor session, java.lang.Object owner)  
      java.lang.Class returnedClass()  
      void setPropertyValue​(java.lang.Object component, int property, java.lang.Object value)  
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • TYPE_NAME

        public static final java.lang.String TYPE_NAME
        The name of this type registered with JPA. See the example in class doc.
        See Also:
        Constant Field Values
    • Constructor Detail

      • JodaMoneyType

        public JodaMoneyType()
    • Method Detail

      • getPropertyNames

        public java.lang.String[] getPropertyNames()
        Specified by:
        getPropertyNames in interface org.hibernate.usertype.CompositeUserType
      • getPropertyTypes

        public org.hibernate.type.Type[] getPropertyTypes()
        Specified by:
        getPropertyTypes in interface org.hibernate.usertype.CompositeUserType
      • getPropertyValue

        public java.lang.Object getPropertyValue​(java.lang.Object component,
                                                 int property)
                                          throws org.hibernate.HibernateException
        Specified by:
        getPropertyValue in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
      • setPropertyValue

        public void setPropertyValue​(java.lang.Object component,
                                     int property,
                                     java.lang.Object value)
                              throws org.hibernate.HibernateException
        Specified by:
        setPropertyValue in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
      • returnedClass

        public java.lang.Class returnedClass()
        Specified by:
        returnedClass in interface org.hibernate.usertype.CompositeUserType
      • equals

        public boolean equals​(java.lang.Object x,
                              java.lang.Object y)
                       throws org.hibernate.HibernateException
        Specified by:
        equals in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
      • hashCode

        public int hashCode​(java.lang.Object x)
                     throws org.hibernate.HibernateException
        Specified by:
        hashCode in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
      • nullSafeGet

        @Nullable
        public java.lang.Object nullSafeGet​(java.sql.ResultSet rs,
                                            java.lang.String[] names,
                                            org.hibernate.engine.spi.SharedSessionContractImplementor session,
                                            java.lang.Object owner)
                                     throws org.hibernate.HibernateException,
                                            java.sql.SQLException
        Specified by:
        nullSafeGet in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
        java.sql.SQLException
      • nullSafeSet

        public void nullSafeSet​(java.sql.PreparedStatement st,
                                java.lang.Object value,
                                int index,
                                org.hibernate.engine.spi.SharedSessionContractImplementor session)
                         throws org.hibernate.HibernateException,
                                java.sql.SQLException
        Specified by:
        nullSafeSet in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
        java.sql.SQLException
      • deepCopy

        public java.lang.Object deepCopy​(java.lang.Object value)
                                  throws org.hibernate.HibernateException
        Specified by:
        deepCopy in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
      • isMutable

        public boolean isMutable()
        Specified by:
        isMutable in interface org.hibernate.usertype.CompositeUserType
      • disassemble

        public java.io.Serializable disassemble​(java.lang.Object value,
                                                org.hibernate.engine.spi.SharedSessionContractImplementor session)
                                         throws org.hibernate.HibernateException
        Specified by:
        disassemble in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
      • assemble

        public java.lang.Object assemble​(java.io.Serializable cached,
                                         org.hibernate.engine.spi.SharedSessionContractImplementor session,
                                         java.lang.Object owner)
                                  throws org.hibernate.HibernateException
        Specified by:
        assemble in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException
      • replace

        public java.lang.Object replace​(java.lang.Object original,
                                        java.lang.Object target,
                                        org.hibernate.engine.spi.SharedSessionContractImplementor session,
                                        java.lang.Object owner)
                                 throws org.hibernate.HibernateException
        Specified by:
        replace in interface org.hibernate.usertype.CompositeUserType
        Throws:
        org.hibernate.HibernateException