【问题标题】:OpenJPA - Extending PersistenceMappingDefaults to convert Camel-Case to UnderscoresOpenJPA - 扩展 PersistenceMappingDefaults 以将 Camel-Case 转换为下划线
【发布时间】:2011-05-13 19:50:17
【问题描述】:
public class ImprovedMappingDefaults extends PersistenceMappingDefaults {
    @Override
    protected void correctName(Table table, Column col) {
        String name = col.getName();
        name = addUnderscores(name);
        col.setName(dict.getValidColumnName(name, table));
    }

    // taken from Hibernate's ImprovedNamingStrategy
    private static String addUnderscores(String name) {
        StringBuffer buf = new StringBuffer(name.replace('.', '_'));
        for (int i = 1; i < buf.length() - 1; i++) {
            if (Character.isLowerCase(buf.charAt(i - 1)) && Character.isUpperCase(buf.charAt(i)) && Character.isLowerCase(buf.charAt(i + 1))) {
                buf.insert(i++, '_');
            }
        }
        return buf.toString().toLowerCase();
    }
}

上述代码通过将驼峰式字段名称转换为数据库中的下划线,在 Openjpa 1.2.2 中正确生成 DDL。然而,像 em.persist() 这样的持久化操作会生成错误的 SQL 并失败。

org.apache.openjpa.lib.jdbc.ReportingSQLException: Column not found: VERSION5 in statement [INSERT INTO FOO_FILE (file_id, VERSION5, DATETIME05, FILE_NAME5, INPUT_SYSTEM5, IS_END_OF_DAY5, SEQUENCE_NUMBER5, TOTAL_AMOUNT5, TOTAL_COUNT5, MY_FILE_ID5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)] {INSERT INTO FOO_FILE (file_id, VERSION5, DATETIME05, FILE_NAME5, INPUT_SYSTEM5, IS_END_OF_DAY5, SEQUENCE_NUMBER5, TOTAL_AMOUNT5, TOTAL_COUNT5, MY_FILE_ID5) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)} [code=-28, state=S0022]

请注意,openjpa 将“5”附加到每列。不知道这是从哪里来的。生成的 FOO_FILE 的 DDL 是:

CREATE TABLE FOO_FILE (file_id BIGINT NOT NULL, VERSION INTEGER, DATETIME0 TIME, FILE_NAME VARCHAR(100), INPUT_SYSTEM VARCHAR(3), IS_END_OF_DAY BIT, SEQUENCE_NUMBER BIGINT, TOTAL_AMOUNT NUMERIC, TOTAL_COUNT INTEGER, MY_FILE_ID VARCHAR(255), PRIMARY KEY (file_id))

为了仔细检查我的逻辑是否错误,我用超类方法(使用匈牙利符号)替换了 correctName()。

protected void correctName(Table table, Column col) {
    String name = col.getName();
    name = removeHungarianNotation(name);
    col.setName(dict.getValidColumnName(name, table));
}

那也失败了。

有没有人成功扩展 PersistenceMappingDefaults 以更改列/表名称?看来openjpa在这方面和Hibernate相比太复杂了。

【问题讨论】:

    标签: jpa openjpa


    【解决方案1】:

    我已经测试了您上面的代码,它适用于 OpenJPA 2.2.0。

    成功地将驼峰式字段名称映射到 db 中的下划线。

    所以字段private String taxRate; 引用db 列TAX_RATE 而无需使用@Column(name = 'TAX_RATE') 进行注释

    请记住,persistence.xml 需要在&lt;persistence-unit&gt; 中定义这样的属性:

        <properties>
            <property name="openjpa.jdbc.MappingDefaults"
                value="com.myproject.ImprovedMappingDefaults"/>
        </properties>
    

    如果 OpenJPA 团队可以将其作为一个选项,那就太好了,例如 removeHungarianNotation...

    【讨论】:

      【解决方案2】:

      它适用于当前版本的 OpenJPA。见example here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-08
        • 2015-11-19
        • 2023-02-08
        • 2023-04-03
        • 1970-01-01
        • 2011-08-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多