2010-09-01 23 views
5

Vì vậy, tôi có lược đồ DB hiện tại với một số bảng mà tôi muốn lập mô hình với JPA/Hibernate. Mỗi bảng có cùng một nhóm 30 cột bổ sung (để cho phép mở rộng thời gian chạy của số trường được ghi ).Có thể định nghĩa động các tên cột trong Hibernate/JPA không?

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

tôi có kế hoạch để xác định các lớp học đơn giản cho mỗi bảng

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

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

    @Id 
    Long id = null; 
} 

và sau đó xác định các tham số bổ sung phổ biến ở một lớp học phổ biế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; 
} 

trong khi điều này sẽ làm việc, tôi không như bản chất mã hóa của lớp.

Tôi muốn mô hình hóa từng bộ trường chuỗi, trường dài và kép làm nhóm thông số bổ sung và sau đó có 0,9 nhóm. Điều này sẽ cho phép tôi dễ dàng thêm các nhóm phụ sau này nếu cần.

Nếu tôi sử dụng giải pháp lập bản đồ xml, tôi có thể tự động xác định tên cột chính xác khi tạo tệp .hbm.xml cho mỗi bảng. Tôi muốn sử dụng một giải pháp chú thích, nhưng có cách nào để ghi đè lên phương thức @Column getName() để tôi có thể trả về tên cột được tạo động không?

Trả lời

12

Bạn cần tạo một tùy chỉnh NamingStrategy.

Giả sử bạn sử dụng lò xo và ngủ đông với JPA, đây là một đoạn cấu hình với một NamingStrategy tùy chỉnh:

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

Nếu bạn không sử dụng lò xo, cấu hình sẽ khác nhau, nhưng bạn vẫn có thể sử dụng một tùy chỉnh NamingStrategy (xem Implementing a NamingStrategy từ Tài liệu Hibernate).

Dù sao, đây là một NamingStrategy mẫu mà xây dựng bảng tên của TYPE1_TYPE2 hình thức cho tham gia bảng và bổ sung thêm một tiền tố chung cho tất cả các bảng:

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

này sẽ làm điều đó thực sự, 1 –

Các vấn đề liên quan