知识大全 Hibernate如何映射枚举类型

Posted 类型

篇首语:读书是最好的学习。追随伟大人物的思想,是最富有趣味的一门科学。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Hibernate如何映射枚举类型相关的知识,希望对你有一定的参考价值。

Hibernate如何映射枚举类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  问题

  Java BO类Gender是枚举类型 想在数据库中存成字符串格式 如何编写hbm xml?

  [java] view plaincopyprint?

  public enum Gender

  UNKNOWN( Unknown )

  MALE( Male )

  FEMALE( Female );

  private String key;

  private Gender(final String key)

  this key = key;

  

  public getGender(String key)

  for (Gender gender : Gender values())

  if (key euqals(gender getKey()))

  return gender;

  

  throw new NoSuchElementException(key);

  

  

  public enum Gender

  UNKNOWN( Unknown )

  MALE( Male )

  FEMALE( Female );

  private String key;

  private Gender(final String key)

  this key = key;

  

  public getGender(String key)

  for (Gender gender : Gender values())

  if (key euqals(gender getKey()))

  return gender;

  

  throw new NoSuchElementException(key);

  

  

  使用UserType

  [java] view plaincopyprint?

  public class GenderUserType implements UserType

  private static int[] typeList =   Types VARCHAR;

  /*

  * Return the SQL type codes for the columns mapped by this type

  * The codes are defined on <tt>java sql Types</tt> */

  /**设置和Gender类的sex属性对应的字段的SQL类型 */

  public int[] sqlTypes()

  return typeList;

  

  /*The class returned by <tt>nullSafeGet()</tt> */

  /** 设置GenderUserType所映射的Java类 Gender类 */

  public Class returnedClass()

  return Gender class;

  

  /** 指明Gender类是不可变类 */

  public boolean isMutable()

  return false;

  

  /*

  * Return a deep copy of the persistent state stopping at entities and at

  * collections It is not necessary to copy immutable objects or null

  * values in which case it is safe to simply return the argument

  */

  /** 返回Gender对象的快照 由于Gender类是不可变类 因此直接将参数代表的Gender对象返回 */

  public Object deepCopy(Object value)

  return (Gender)value;

  

  /** 比较一个Gender对象是否和它的快照相同 */

  public boolean equals(Object x Object y)

  //由于内存中只可能有两个静态常量Gender实例

  //因此可以直接按内存地址比较

  return (x == y);

  

  public int hashCode(Object x)

  return x hashCode();

  

  /*

  * Retrieve an instance of the mapped class from a JDBC resultset Implementors

  * should handle possibility of null values

  */

  /** 从JDBC ResultSet中读取key 然后返回相应的Gender实例 */

  public Object nullSafeGet(ResultSet rs String[] names Object owner)

  throws HibernateException SQLException

  //从ResultSet中读取key

  String sex = (String) Hibernate STRING nullSafeGet(rs names[ ]);

  if (sex == null) return null;

  //按照性别查找匹配的Gender实例

  try

  return Gender getGender(sex);

  catch (java util NoSuchElementException e)

  throw new HibernateException( Bad Gender value: + sex e);

  

  

  /*

  * Write an instance of the mapped class to a prepared statement Implementors

  * should handle possibility of null values

  * A multi column type should be written to parameters starting from <tt>index</tt>

  */

  /** 把Gender对象的key属性添加到JDBC PreparedStatement中 */

  public void nullSafeSet(PreparedStatement st Object value int index)

  throws HibernateException SQLException

  String sex = null;

  if (value != null)

  sex = ((Gender)value) getKey();

  Hibernate String nullSafeSet(st sex index);

  

  /*

  * Reconstruct an object from the cacheable representation At the very least this

  * method should perform a deep copy if the type is mutable (optional operation)

  */

  public Object assemble(Serializable cached Object owner)

  return cached;

  

  /*

  * Transform the object into its cacheable representation At the very least this

  * method should perform a deep copy if the type is mutable That may not be enough

  * for some implementations however; for example associations must be cached as

  * identifier values (optional operation)

  */

  public Serializable disassemble(Object value)

  return (Serializable)value;

  

  /*

  * During merge replace the existing (target) value in the entity we are merging to

  * with a new (original) value from the detached entity we are merging For immutable

  * objects or null values it is safe to simply return the first parameter For

  * mutable objects it is safe to return a copy of the first parameter For objects

  * with ponent values it might make sense to recursively replace ponent values

  */

  public Object replace(Object original Object target Object owner)

  return original;

  

  

  public class GenderUserType implements UserType

  private static int[] typeList =   Types VARCHAR;

  /*

  * Return the SQL type codes for the columns mapped by this type

  * The codes are defined on <tt>java sql Types</tt> */

  /**设置和Gender类的sex属性对应的字段的SQL类型 */

  public int[] sqlTypes()

  return typeList;

  

  /*The class returned by <tt>nullSafeGet()</tt> */

  /** 设置GenderUserType所映射的Java类 Gender类 */

  public Class returnedClass()

  return Gender class;

  

  /** 指明Gender类是不可变类 */

  public boolean isMutable()

  return false;

  

  /*

  * Return a deep copy of the persistent state stopping at entities and at

  * collections It is not necessary to copy immutable objects or null

  * values in which case it is safe to simply return the argument

  */

  /** 返回Gender对象的快照 由于Gender类是不可变类 因此直接将参数代表的Gender对象返回 */

  public Object deepCopy(Object value)

  return (Gender)value;

  

  /** 比较一个Gender对象是否和它的快照相同 */

  public boolean equals(Object x Object y)

  //由于内存中只可能有两个静态常量Gender实例

  //因此可以直接按内存地址比较

  return (x == y);

  

  public int hashCode(Object x)

  return x hashCode();

  

  /*

  * Retrieve an instance of the mapped class from a JDBC resultset Implementors

  * should handle possibility of null values

  */

  /** 从JDBC ResultSet中读取key 然后返回相应的Gender实例 */

  public Object nullSafeGet(ResultSet rs String[] names Object owner)

  throws HibernateException SQLException

  //从ResultSet中读取key

  String sex = (String) Hibernate STRING nullSafeGet(rs names[ ]);

  if (sex == null) return null;

  //按照性别查找匹配的Gender实例

  try

  return Gender getGender(sex);

  catch (java util NoSuchElementException e)

  throw new HibernateException( Bad Gender value: + sex e);

  

  

  /*

  * Write an instance of the mapped class to a prepared statement Implementors

  * should handle possibility of null values

  * A multi column type should be written to parameters starting from <tt>index</tt>

  */

  /** 把Gender对象的key属性添加到JDBC PreparedStatement中 */

  public void nullSafeSet(PreparedStatement st Object value int index)

  throws HibernateException SQLException

  String sex = null;

  if (value != null)

  sex = ((Gender)value) getKey();

  Hibernate String nullSafeSet(st sex index);

  

  /*

  * Reconstruct an object from the cacheable representation At the very least this

  * method should perform a deep copy if the type is mutable (optional operation)

  */

  public Object assemble(Serializable cached Object owner)

  return cached;

  

  /*

  * Transform the object into its cacheable representation At the very least this

  * method should perform a deep copy if the type is mutable That may not be enough

  * for some implementations however; for example associations must be cached as

  * identifier values (optional operation)

  */

  public Serializable disassemble(Object value)

  return (Serializable)value;

  

  /*

  * During merge replace the existing (target) value in the entity we are merging to

  * with a new (original) value from the detached entity we are merging For immutable

  * objects or null values it is safe to simply return the first parameter For

  * mutable objects it is safe to return a copy of the first parameter For objects

  * with ponent values it might make sense to recursively replace ponent values

  */

  public Object replace(Object original Object target Object owner)

  return original;

  

  

  然后再hbm xml中定义映射关系

  [] view plaincopyprint?

  <hibernate mapping package= default lazy= true default cascade= save update merge persist >

  <typedef name= Gender class= alpha hibernate GenderUserType >

  <property name= gender type= Gender >

  <column name= GENDER not null= true >

  </column>

  </property>

  <hibernate mapping package= default lazy= true default cascade= save update merge persist >

  <typedef name= Gender class= alpha hibernate GenderUserType >

  <property name= gender type= Gender >

  <column name= GENDER not null= true >

  </column>

  </property>

  延伸

  为每个枚举类型定义一个UserType是比较麻烦的 可以定义一个抽象类

  例如扩展下例即可适用于所有保存为index的枚举类型

  [java] view plaincopyprint?

  public abstract class OrdinalEnumUserType<E extends Enum<E>> implements UserType

  protected Class<E> clazz;

  protected OrdinalBasedEnumUserType(Class<E> clazz)

  this clazz = clazz;

  

  private static final int[] SQL_TYPES = Types NUMERIC;

  public int[] sqlTypes()

  return SQL_TYPES;

  

  public Class<?> returnedClass()

  return clazz;

  

  public E nullSafeGet(ResultSet resultSet String[] names Object owner)

  throws HibernateException SQLException

  //Hibernate STRING nullSafeGet(rs names[ ])

  int index = resultSet getInt(names[ ]);

  E result = null;

  if (!resultSet wasNull())

  result = clazz getEnumConstants()[index];

  

  return result;

  

  public void nullSafeSet(PreparedStatement preparedStatement

  Object value int index) throws HibernateException SQLException

  if (null == value)

  preparedStatement setNull(index Types NUMERIC);

   else

  //Hibernate String nullSafeSet(st sex index);

  preparedStatement setInt(index ((E)value) ordinal());

  

  

  public Object deepCopy(Object value) throws HibernateException

  return value;

  

  public boolean isMutable()

  return false;

  

  public Object assemble(Serializable cached Object owner)

  throws HibernateException

  return cached;

  

  public Serializable disassemble(Object value) throws HibernateException

  return (Serializable)value;

  

  public Object replace(Object original Object target Object owner)

  throws HibernateException

  return original;

  

  public int hashCode(Object x) throws HibernateException

  return x hashCode();

  

  public boolean equals(Object x Object y) throws HibernateException

  if (x == y)

  return true;

  if (null == x || null == y)

  return false;

  return x equals(y);

  

  

  public abstract class OrdinalEnumUserType<E extends Enum<E>> implements UserType

  protected Class<E> clazz;

  protected OrdinalBasedEnumUserType(Class<E> clazz)

  this clazz = clazz;

  

  private static final int[] SQL_TYPES = Types NUMERIC;

  public int[] sqlTypes()

  return SQL_TYPES;

  

  public Class<?> returnedClass()

  return clazz;

  

  public E nullSafeGet(ResultSet resultSet String[] names Object owner)

  throws HibernateException SQLException

  //Hibernate STRING nullSafeGet(rs names[ ])

  int index = resultSet getInt(names[ ]);

  E result = null;

  if (!resultSet wasNull())

  result = clazz getEnumConstants()[index];

  

  return result;

  

  public void nullSafeSet(PreparedStatement preparedStatement

  Object value int index) throws HibernateException SQLException

  if (null == value)

  preparedStatement setNull(index Types NUMERIC);

   else

  //Hibernate String nullSafeSet(st sex index);

  preparedStatement setInt(index ((E)value) ordinal());

  

  

  public Object deepCopy(Object value) throws HibernateException

  return value;

  

  public boolean isMutable()

  return false;

  

  public Object assemble(Serializable cached Object owner)

  throws HibernateException

  return cached;

  

  public Serializable disassemble(Object value) throws HibernateException

  return (Serializable)value;

  

  public Object replace(Object original Object target Object owner)

  throws HibernateException

  return original;

  

  public int hashCode(Object x) throws HibernateException

  return x hashCode();

  

  public boolean equals(Object x Object y) throws HibernateException

  if (x == y)

  return true;

  if (null == x || null == y)

  return false;

  return x equals(y);

  

cha138/Article/program/Java/ky/201311/28186

相关参考

知识大全 Hibernate的基本标签和映射

Hibernate的基本标签和映射  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  hiberna

知识大全 Hibernate复合主键映射

Hibernate复合主键映射  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 精通Hibernate之映射继承关系(二)

精通Hibernate之映射继承关系(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  把每个

知识大全 Spring动态加载Hibernate映射文件

Spring动态加载Hibernate映射文件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!&nb

知识大全 精通Hibernate之映射继承关系(一)

精通Hibernate之映射继承关系(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在域模

知识大全 精通Hibernate之映射继承关系八

精通Hibernate之映射继承关系八  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  由于关系数

知识大全 从Hibernate的映射谈编程思想

从Hibernate的映射谈编程思想  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多java

知识大全 hibernate关系映射

  一对象关系映射基础  对象间的基本关系  首先我简要阐明一下对象之间的基本关系在这以后UML的课程中也会深入的学习对象具有的四种基本关系  关联关系关联关系在设计模式中是被提倡优先使用于继承关系的

知识大全 精通Hibernate之映射继承关系三

精通Hibernate之映射继承关系三  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  <h

知识大全 精通Hibernate之映射继承关系二(图)

精通Hibernate之映射继承关系二(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  把每