gpt4 book ai didi

jpa - OpenJPA - 扩展 PersistenceMappingDefaults 以将 Camel-Case 转换为下划线

转载 作者:行者123 更新时间:2023-12-01 06:51:23 25 4
gpt4 key购买 nike

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

为了仔细检查我的逻辑是否有误,我用父类(super class)方法(使用匈牙利表示法)替换了正确名称()。
protected void correctName(Table table, Column col) {
String name = col.getName();
name = removeHungarianNotation(name);
col.setName(dict.getValidColumnName(name, table));
}

那也失败了。

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

最佳答案

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

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

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

请记住,persistence.xml 需要在 <persistence-unit> 中定义这样的属性。 :

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

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

关于jpa - OpenJPA - 扩展 PersistenceMappingDefaults 以将 Camel-Case 转换为下划线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5997051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com