2010-09-01 19 views
5

Bu yüzden mevcut DB şemasına JPA/Hazırda Bekletme modunu kullanmak istediğim bir dizi tabloyla sahibim. Her bir tablonun aynı grup 30 ek sütununa sahiptir (kaydedilen alanların sayısının numaralı çalışma zamanının genişlemesine izin vermek için).Hibernate/JPA'da sütun adlarını dinamik olarak tanımlamak mümkün mü?

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), 
} 

Her tablo için

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

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

    @Id 
    Long id = null; 
} 

basit sınıfları tanımlamak ve bu işe olurken o benim yok, ortak bir sınıfın

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; 
} 

ortak ek parametreleri tanımlamak için plan sınıfın hardcoded doğası gibi.

Her bir dizi dizisini, uzun ve çift alanları ek bir parametre grubu olarak modellemek istiyorum ve , 0..9 gruba sahip. Bu, gerekirse daha fazla grubu kolayca eklememe izin verir.

xml eşleme çözümünü kullanırsam, her tablo için .hbm.xml 'u oluştururken dinamik olarak doğru sütun adını belirleyebilirim. Açıklamalı bir çözüm kullanmayı tercih ediyorum, ancak dinamik olarak oluşturulmuş bir sütun adını döndürmek için @ Column getName() yöntemi 'u geçersiz kılacak bir yol var mı?

cevap

12

Özel bir NamingStrategy oluşturmanız gerekir. Eğer yayı kullanmazsanız

<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> 

, yapılandırma farklı olacaktır, ancak yine özel bir kullanabilirsiniz:

Eğer yayı kullanmak ve JPA hazırda bekleme varsayarsak, burada özel bir NamingStrategy bir yapılandırma snippet'idir NamingStrategy (Hazırda Bekletilen Dokümantasyondan Implementing a NamingStrategy'a bakın).

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

Bu, 1 gerçekten yapacak:

Neyse

, burada tabloları birleştirmek için formu TYPE1_TYPE2 tablosu adlarını oluşturur ve tüm tablolara ortak önek ekleyen bir örnek NamingStrategy olduğunu –

İlgili konular