Class JodaMoneyType
- java.lang.Object
-
- google.registry.persistence.converter.JodaMoneyType
-
- All Implemented Interfaces:
org.hibernate.usertype.CompositeUserType
public class JodaMoneyType extends java.lang.Object implements org.hibernate.usertype.CompositeUserType
Defines JPA mapping forJoda Money type
.Money
is mapped to two table columns, a textcurrency
column that stores the currency code, and a numericamount
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)
-
-
-
Field Detail
-
INSTANCE
public static final JodaMoneyType INSTANCE
-
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
-
-
Method Detail
-
getPropertyNames
public java.lang.String[] getPropertyNames()
- Specified by:
getPropertyNames
in interfaceorg.hibernate.usertype.CompositeUserType
-
getPropertyTypes
public org.hibernate.type.Type[] getPropertyTypes()
- Specified by:
getPropertyTypes
in interfaceorg.hibernate.usertype.CompositeUserType
-
getPropertyValue
public java.lang.Object getPropertyValue(java.lang.Object component, int property) throws org.hibernate.HibernateException
- Specified by:
getPropertyValue
in interfaceorg.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 interfaceorg.hibernate.usertype.CompositeUserType
- Throws:
org.hibernate.HibernateException
-
returnedClass
public java.lang.Class returnedClass()
- Specified by:
returnedClass
in interfaceorg.hibernate.usertype.CompositeUserType
-
equals
public boolean equals(java.lang.Object x, java.lang.Object y) throws org.hibernate.HibernateException
- Specified by:
equals
in interfaceorg.hibernate.usertype.CompositeUserType
- Throws:
org.hibernate.HibernateException
-
hashCode
public int hashCode(java.lang.Object x) throws org.hibernate.HibernateException
- Specified by:
hashCode
in interfaceorg.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 interfaceorg.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 interfaceorg.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 interfaceorg.hibernate.usertype.CompositeUserType
- Throws:
org.hibernate.HibernateException
-
isMutable
public boolean isMutable()
- Specified by:
isMutable
in interfaceorg.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 interfaceorg.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 interfaceorg.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 interfaceorg.hibernate.usertype.CompositeUserType
- Throws:
org.hibernate.HibernateException
-
-