Added patch by Joachim Van der Auwera to support package level annotations
[hibernate4-maven-plugin] / src / it / schemaexport-example / schemaexport-example-domain / src / main / java / de / test / schemaexport / domain / EnumUserType.java
diff --git a/src/it/schemaexport-example/schemaexport-example-domain/src/main/java/de/test/schemaexport/domain/EnumUserType.java b/src/it/schemaexport-example/schemaexport-example-domain/src/main/java/de/test/schemaexport/domain/EnumUserType.java
new file mode 100644 (file)
index 0000000..6e59890
--- /dev/null
@@ -0,0 +1,110 @@
+package de.test.schemaexport.domain;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.spi.SessionImplementor;
+import org.hibernate.usertype.EnhancedUserType;
+import org.hibernate.usertype.ParameterizedType;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Properties;
+
+/**
+ * This Hibernate UserType is used to map JDK 5 Enums directly in a column.
+ * Define this UserType in your hbm.xml mapping file like the following example:
+ */
+public class EnumUserType implements EnhancedUserType, ParameterizedType {
+
+    private Class<Enum> enumClass;
+
+    @Override
+    public void setParameterValues(Properties parameters) {
+        String enumClassName = parameters.getProperty("enumClassName");
+        try {
+            enumClass = (Class<Enum>) Class.forName(enumClassName);
+        } catch (ClassNotFoundException cnfe) {
+            throw new HibernateException("Enum class not found", cnfe);
+        }
+    }
+
+    @Override
+    public Object assemble(Serializable cached, Object owner) throws HibernateException {
+        return cached;
+    }
+
+    @Override
+    public Object deepCopy(Object value) throws HibernateException {
+        return value;
+    }
+
+    @Override
+    public Serializable disassemble(Object value) throws HibernateException {
+        return (Enum) value;
+    }
+
+    @Override
+    public boolean equals(Object x, Object y) throws HibernateException {
+        return x == y;
+    }
+
+    @Override
+    public int hashCode(Object x) throws HibernateException {
+        return x.hashCode();
+    }
+
+    @Override
+    public boolean isMutable() {
+        return false;
+    }
+
+    @Override
+    public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor sessionImplementor, Object owner)
+            throws HibernateException, SQLException {
+        String name = rs.getString(names[0]);
+        return rs.wasNull() ? null : Enum.valueOf(enumClass, name);
+    }
+
+    @Override
+    public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor sessionImplementor)
+            throws HibernateException, SQLException {
+        if (value == null) {
+            st.setNull(index, Types.VARCHAR);
+        } else {
+            st.setString(index, ((Enum) value).name());
+        }
+    }
+
+    @Override
+    public Object replace(Object original, Object target, Object owner) throws HibernateException {
+        return original;
+    }
+
+    @Override
+    public Class returnedClass() {
+        return enumClass;
+    }
+
+    @Override
+    public int[] sqlTypes() {
+        return new int[]{Types.VARCHAR};
+    }
+
+    @Override
+    public Object fromXMLString(String xmlValue) {
+        return Enum.valueOf(enumClass, xmlValue);
+    }
+
+    @Override
+    public String objectToSQLString(Object value) {
+        return '\'' + ((Enum) value).name() + '\'';
+    }
+
+    @Override
+    public String toXMLString(Object value) {
+        return ((Enum) value).name();
+    }
+
+}