简体   繁体   English

是否可以在Hibernate / JPA中动态定义列名?

[英]Is it possible to dynamically define column names in Hibernate / JPA?

So i have this existing DB schema with a number of tables that i want to model with JPA/Hibernate. 所以我有这个现有的数据库模式,其中包含许多我想用JPA / Hibernate建模的表。 Each table has the same group of 30 additional columns ( to allow for runtime expansion of the number of fields recorded). 每个表具有相同的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),
}

I plan to define simple classes for each table 我计划为每个表定义简单的类

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

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

    @Id
    Long id = null;
}

and then define the common additional parameters in a common class 然后在公共类中定义公共附加参数

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

while this will work, i don't like the hardcoded nature of the class. 虽然这会奏效,但我不喜欢班级的硬编码性质。

I would like to model each set of string,long and double fields as an additional parameter group, and then have 0..9 groups. 我想将每组字符串,长字段和双字段模型作为附加参数组,然后具有0..9组。 This would allow me easily add extra groups later if required. 如果需要,这将允许我稍后轻松添加额外的组。

If i use the xml mapping solution i can dynamically determine the correct column name when generating the .hbm.xml for each table. 如果我使用xml映射解决方案,我可以在为每个表生成.hbm.xml时动态确定正确的列名。 I would prefer to use an annotated solution, but is there a way to override the @Column getName() method so that i can return a dynamically generated column name? 我更喜欢使用带注释的解决方案,但有没有办法覆盖@Column getName()方法,以便我可以返回动态生成的列名?

You need to create a custom NamingStrategy . 您需要创建自定义NamingStrategy

Assuming you use spring and hibernate with JPA, here is a configuration snippet with a custom NamingStrategy: 假设您在JPA中使用spring和hibernate,这是一个带有自定义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>

If you don't use spring, configuration will be different, but you can still use a custom NamingStrategy (see Implementing a NamingStrategy from the Hibernate Documentation). 如果不使用spring,配置会有所不同,但您仍然可以使用自定义NamingStrategy(请参阅从Hibernate文档实现NamingStrategy )。

Anyway, here is a sample NamingStrategy that builds table names of the form TYPE1_TYPE2 for join tables and adds a common prefix to all tables: 无论如何,这是一个示例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("_", "");

    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 休眠定义可能的列值 - hibernate define possible column values 如何重命名列名 - JPA Hibernate - How to rename the column names - JPA Hibernate 如何在JPA和Hibernate中将数据库生成的列值定义为只读字段? - How to define database generated column values as readonly fields in JPA and Hibernate? Spring JPA Hibernate 在可分页请求中使用旧的 @Column 名称:PropertyReferenceException - Spring JPA Hibernate uses old @Column names in Pageable requests: PropertyReferenceException 如何使用 JPA (hibernate) 捕获数据库中动态生成的列的值? - How to capture the value of a dynamically generated column in the database using JPA (hibernate)? 是否可以在没有列的情况下在JPA / Hibernate中创建和使用序列生成器? - Is it possible to create and use sequence generator in JPA / Hibernate without a column? 从Hibernate本机查询的结果中获取动态生成的列名 - Getting dynamically generated column names from result of Hibernate native query 是否可以使用JPA / Hibernate(最好是JPA)将数据库表的列中的逻辑OR值映射到对象列表中? - Is it possible to map logical OR value from database table's column into the list of objects using JPA/Hibernate (preferably JPA)? 休眠的小写列名称 - hibernate lowercase column names 在Hibernate / JPA映射中的列名上自动添加特定于表的前缀? - Automatically adding table-specific prefixes on column names in Hibernate/JPA mappings?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM