2010-09-01 10 views
5

तो मेरे पास यह मौजूदा डीबी स्कीमा है जिसमें कई टेबल हैं जिन्हें मैं जेपीए/हाइबरनेट के साथ मॉडल करना चाहता हूं। प्रत्येक तालिका में 30 अतिरिक्त कॉलम का एक ही समूह है (फ़ील्ड रिकॉर्ड की संख्या के रनटाइम विस्तार की अनुमति देने के लिए)।क्या हाइबरनेट/जेपीए में कॉलम नामों को गतिशील रूप से परिभाषित करना संभव है?

CREATE TABLE XX 
    (
    "ID"   VARCHAR2(100 BYTE) NOT NULL ENABLE, 
    "USER_LABEL"  VARCHAR2(256 BYTE), 
    "CREATION_DATE" NUMBER(38,0) NOT NULL ENABLE, 
    "ADD_STR_FIELD_0" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_0" NUMBER(38,0), 
    "ADD_DBL_FIELD_0" NUMBER(38,0), 
    "ADD_STR_FIELD_1" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_1" NUMBER(38,0), 
    "ADD_DBL_FIELD_1" NUMBER(38,0), 
    "ADD_STR_FIELD_2" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_2" NUMBER(38,0), 
    "ADD_DBL_FIELD_2" NUMBER(38,0), 
    "ADD_STR_FIELD_3" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_3" NUMBER(38,0), 
    "ADD_DBL_FIELD_3" NUMBER(38,0), 
    "ADD_STR_FIELD_4" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_4" NUMBER(38,0), 
    "ADD_DBL_FIELD_4" NUMBER(38,0), 
    "ADD_STR_FIELD_5" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_5" NUMBER(38,0), 
    "ADD_DBL_FIELD_5" NUMBER(38,0), 
    "ADD_STR_FIELD_6" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_6" NUMBER(38,0), 
    "ADD_DBL_FIELD_6" NUMBER(38,0), 
    "ADD_STR_FIELD_7" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_7" NUMBER(38,0), 
    "ADD_DBL_FIELD_7" NUMBER(38,0), 
    "ADD_STR_FIELD_8" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_8" NUMBER(38,0), 
    "ADD_DBL_FIELD_8" NUMBER(38,0), 
    "ADD_STR_FIELD_9" VARCHAR2(200 BYTE), 
    "ADD_LNG_FIELD_9" NUMBER(38,0), 
    "ADD_DBL_FIELD_9" NUMBER(38,0), 
} 

मैं

import javax.persistence.Entity; 
import javax.persistence.Id; 
import javax.persistence.Table; 

@Entity 
@Table(name="XX") 
public class XX { 

    @Id 
    Long id = null; 
} 

हर तालिका के लिए सरल वर्गों को परिभाषित करने के लिए और फिर एक सामान्य वर्ग

import javax.persistence.Column; 

public abstract class AdditionalParameters { 

    @Column(name="ADD_STR_FIELD_0") 
    private String addStringField0 = null; 
    @Column(name="ADD_LNG_FIELD_0") 
    private Long addLongField0 = null; 
    @Column(name="ADD_DBL_FIELD_0") 
    private Double addDoubleField0 = null; 
    .... 
    .... 
    .... 
    @Column(name="ADD_STR_FIELD_8") 
    private String addStringField8 = null; 
    @Column(name="ADD_LNG_FIELD_8") 
    private Long addLongField8 = null; 
    @Column(name="ADD_DBL_FIELD_8") 
    private Double addDoubleField8 = null; 
} 

में आम अतिरिक्त पैरामीटर परिभाषित करते हुए यह काम करेंगे, मैं नहीं की योजना कक्षा की हार्डकोडेड प्रकृति की तरह।

मैं अतिरिक्त पैरामीटर समूह के रूप में स्ट्रिंग, लंबे और डबल फ़ील्ड्स के प्रत्येक सेट को मॉडल करना चाहता हूं, और फिर में 0..9 समूह हैं। यह आवश्यक होने पर बाद में अतिरिक्त समूहों को आसानी से जोड़ने की अनुमति देगा।

यदि मैं एक्सएमएल मैपिंग समाधान का उपयोग करता हूं तो मैं प्रत्येक तालिका के लिए .hbm.xml उत्पन्न करते समय गतिशील रूप से सही कॉलम नाम निर्धारित कर सकता हूं। मैं एक एनोटेटेड समाधान का उपयोग करना पसंद करूंगा, लेकिन क्या @ कॉलम getName() विधि को ओवरराइड करने का कोई तरीका है ताकि मैं गतिशील रूप से जेनरेट किए गए कॉलम नाम को वापस कर सकूं?

उत्तर

12

आपको एक कस्टम NamingStrategy बनाने की आवश्यकता है।

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="myunit" /> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="persistenceXmlLocation" 
       value="classpath:META-INF/persistence.xml" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="false" /> 
      <property name="generateDdl" value="true" /> 
      <property name="database" value="MYSQL" /> 
     </bean> 
    </property> 
    <property name="jpaProperties"> 
     <props> 
      <prop 
       key="hibernate.ejb.naming_strategy"> 
       com.yourcompany.CustomNamingStrategy 
      </prop> 
     </props> 
    </property> 
</bean> 

आप वसंत उपयोग नहीं करते हैं, विन्यास अलग होगा, लेकिन आप अभी भी एक कस्टम का उपयोग कर सकते हैं:

मान लिया जाये कि आप वसंत का उपयोग करें और जेपीए साथ हाइबरनेट, यहां कस्टम NamingStrategy के साथ एक विन्यास टुकड़ा है NamingStrategy (Hibernate दस्तावेज़ीकरण से Implementing a NamingStrategy देखें)।

वैसे भी, यहाँ एक नमूना NamingStrategy कि टेबल में शामिल होने के लिए प्रपत्र TYPE1_TYPE2 की तालिका नाम बनाता है और सभी तालिकाओं के लिए एक आम उपसर्ग कहते है:

public class CustomNamingStrategy extends ImprovedNamingStrategy { 

    private static final long serialVersionUID = 1L; 
    private static final String PREFIX = "PFX_"; 

    @Override 
    public String classToTableName(final String className) { 
     return this.addPrefix(super.classToTableName(className)); 
    } 

    @Override 
    public String collectionTableName(final String ownerEntity, 
      final String ownerEntityTable, final String associatedEntity, 
      final String associatedEntityTable, final String propertyName) { 
     return this.addPrefix(super.collectionTableName(ownerEntity, 
       ownerEntityTable, associatedEntity, associatedEntityTable, 
       propertyName)); 
    } 

    @Override 
    public String logicalCollectionTableName(final String tableName, 
      final String ownerEntityTable, final String associatedEntityTable, 
      final String propertyName) { 
     return this.addPrefix(super.logicalCollectionTableName(tableName, 
       ownerEntityTable, associatedEntityTable, propertyName)); 
    } 

    private String addPrefix(final String composedTableName) { 

     return PREFIX 
       + composedTableName.toUpperCase().replace("_", ""); 

    } 

} 
+1

यह यह वास्तव में क्या करेंगे, +1 –

संबंधित मुद्दे

 संबंधित मुद्दे