2012-03-23 12 views
16

मान लीजिए मैं इस enum है: .hbm में इस मानचित्रण के साथहाइबरनेट नक्शा enum VARCHAR को

public enum TestEnum { EXAMPLE, FURTHER_EXAMPLE, LAST_EXAMPLE } 

:

<property name="testEnum" column="TEST_COLUMN"> 
    <type name="org.hibernate.type.EnumType"> 
     <param name="enumClass">p.a.c.k.TestEnum</param> 
    </type> 
</property> 

enum के रूप में 0, 1, 2 डेटाबेस के लिए भेजा जाता है। मैं मूल्यों को वर्चर्स कॉलम में EXAMPLE, FURTHER_EXAMPLE या LAST_EXAMPLE के रूप में संग्रहीत करना चाहता हूं।

मैं वर्चर कॉलम में enum कैसे मैप कर सकता हूं?

+1

की संभावित डुप्लिकेट। कॉम/प्रश्न/18 9 6666/जोड़-एक-enum-as-a-class-property-in-hbm – barsju

उत्तर

14

EnumType की एक पैरामीटर के रूप में इस जोड़ें:

<param name="type">12</param> 

इसका कारण यह है 12java.sql.Types.VARCHAR

+3

12 java.sql.Types.V के बराबर है ARCHAR। – bvulaj

+2

मैंने समाधान के लिए ब्राउज़ करते समय उस मूल्य को देखा, लेकिन सोचा कि यह enum के लिए एक डिफ़ॉल्ट मान था। यह बहुत वर्णनात्मक नहीं है, एक जादू मूल्य की तरह दिखता है। धन्यवाद! – ipavlic

3

के बराबर है आप डेटाबेस में varchar के रूप में किसी भी enum का मान संग्रहीत करना चाहते हैं, तो नीचे दिए गए चरणों का पालन करें।

  1. हाइबरनेट एक उपयोगकर्ता टेप इंटरफ़ेस प्रदान करता है। हमें एक क्लास बनाने की आवश्यकता है जो उपयोगकर्ता टाइप इंटरफेस लागू करता है।

    import java.io.Serializable; 
    import java.sql.PreparedStatement; 
    import java.sql.ResultSet; 
    import java.sql.SQLException; 
    import java.sql.Types; 
    
    import org.hibernate.HibernateException; 
    import org.hibernate.usertype.UserType; 
    
    public class EnumUserType<E extends Enum<E>> implements UserType { 
        private Class<E> clazz = null; 
    
        protected EnumUserType(Class<E> c) { 
         this.clazz = c; 
        } 
    
        private static final int[] SQL_TYPES = { Types.VARCHAR }; 
    
        public int[] sqlTypes() { 
          return SQL_TYPES; 
        } 
    
        public Class returnedClass() { 
         return clazz; 
        } 
    
        public Object nullSafeGet(ResultSet resultSet, String[] names, Object owner) 
         throws HibernateException, SQLException { 
    
         String name = resultSet.getString(names[0]); 
    
         E result = null; 
         if (!resultSet.wasNull()) { 
          result = Enum.valueOf(clazz, name); 
    
         } 
         return result; 
        } 
    
        public void nullSafeSet(PreparedStatement preparedStatement, Object value, 
         int index) throws HibernateException, SQLException { 
    
         if (null == value) { 
          preparedStatement.setNull(index, Types.VARCHAR); 
         } else { 
          preparedStatement.setString(index, ((Enum) value).name()); 
         } 
        } 
    
        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); 
        } 
    } 
    
  2. मान लीजिए कि मेरे पास एन्क्रिप्शनस्टैटस एनम है।

    import java.io.Serializable; 
    import com.google.gwt.user.client.rpc.IsSerializable; 
    
    public enum EncryptionStatus implements IsSerializable, Serializable { 
        PLAIN, HASH, RE_HASH, SUPER_HASH, SUPER_REHASH, OPEN, ENCRYPT, RE_ENCRYPT 
    } 
    
  3. हम एक वर्ग है जो हमारे बनाया EnumUserType> फैली बनाना होगा।

    public class EncryptionStatusType extends EnumUserType<EncryptionStatus>{ 
    
        public EncryptionStatusType() {  
         super(EncryptionStatus.class); 
        } 
    } 
    
  4. अब हम Enum मैपिंग की जगह में hbm.xml फ़ाइल में बनाया वर्ग जो डेटाबेस में varchar के रूप में enum मान संग्रहीत ऊपर मैप करने के लिए की जरूरत है। उदाहरण के लिए,

<property name="secureStatus" type="com.nextenders.facadeimplementation.util.userenum.EncryptionStatusType" column="secure_status" />

15

हो सकता है कि यह अधिक वर्णनात्मक

<param name="useNamed">true</param> 
+0

'useNamed' 4.2.0 के बाद से हाइबरनेट में है। सामान्यतः' टाइप' के रूप में 3.1beta9 [link] (http://grepcode.com/file/repo1.maven.org/maven2/org) में भी है। हाइबरनेट/हाइबरनेट-कोर/4.2.0. फाइनल/ऑर्ग/हाइबरनेट/टाइप/एनमटाइप.जावा /) [लिंक] (http://grepcode.com/file/repo1.maven.org/maven2/org.hibernate/ हाइबरनेट-एनोटेशन/3.1beta9/org/hibernate/type/EnumType.java /) –

6

आप इस तरह व्याख्या का उपयोग कर सकते हैं: http: // stackoverflow

public class MyClass { 
    TestEnum testEnum; 
    @column(name="TEST_COLUMN") 
    @Enumerated(EnumType.STRING) 
    public TestEnum getTestEnum(){ 
     this.testEnum; 
    } 
} 
+0

प्रश्न एचबीएम मैपिंग के लिए था, एनोटेशन नहीं। – jschreiner