gpt4 book ai didi

jpa - Hibernate 5 中的命名策略与 Hibernate 4 兼容

转载 作者:行者123 更新时间:2023-12-02 04:41:05 26 4
gpt4 key购买 nike

我们目前正在尝试将网络应用从 Wildfly 9.0.2 迁移到 Wildfly 10.1.0,从而从 Hibernate 4.3.10 迁移到 5.0.10

我们从未定义过自己的NamingStrategy ,使用 Hibernate 为我们的实体选择的任何名称(我们的 Postgresql 数据库是通过 hbm2ddl 构建的)。

现在,在 Hibernate 5 中,我们遇到了未知的列错误,因为命名约定似乎已发生变化。具体来说,在连接表中,列名称现在基于真实类而不是父类:例如,我们有 UserEntity它继承自 AgentEntity ,在我们得到 agentEntity_id 之前列,现在是 userEntity_id专栏。

我尝试了现有的四个Hibernate ImplicitNamingStrategies (jpa、legacy-jpa、legacy-hbm 和组件路径)在我们的 persistence.xml 中,没有成功:每一个都与旧策略不同。

那么,有没有办法避免重写我自己的策略以保持符合我们的旧模型?

最佳答案

尽管我们有 Oracle 后端,但我在迁移到 Hibernate 5 时也遇到了同样的问题。通过利用 org.hibernate.boot.model.naming.ImplicitNamingStrategy,我能够实现与 Hibernate 4 开箱即用的命名策略类似的命名策略。和org.hibernate.boot.model.naming.PhysicalNamingStrategy .

这是我的应用程序上下文中的 bean 定义:

@Bean
@Primary
public static JpaProperties jpaProperties() {
final Map<String, String> hibernateConfig = newHashMap();
hibernateConfig.put("hibernate.implicit_naming_strategy",
"org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl");
hibernateConfig.put("hibernate.physical_naming_strategy",
"com.anyapp.CustomNamingStrategy");

final JpaProperties jpaProperties = new JpaProperties();
jpaProperties.setProperties(hibernateConfig);
jpaProperties.setDatabase(ORACLE);
jpaProperties.setDatabasePlatform(ORACLE12C_DIALECT);
jpaProperties.setGenerateDdl(false);
jpaProperties.setShowSql(false);
return jpaProperties;
}

最烦人的部分是找出以何种方式应用哪些命名策略以及我必须实现 CustomNamingStrategy 的事实我自己,因为 Hibernate 不提供 PhysicalNamingStrategy与旧版 ImprovedNamingStrategy 的命名相匹配.

这是我的CustomNamingStrategy的内容:

package com.anyapp;

import org.apache.commons.lang.StringUtils;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class CustomNamingStrategy implements PhysicalNamingStrategy {

@Override
public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnv) {
return convert(identifier);
}

@Override
public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnv) {
return convert(identifier);
}

@Override
public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnv) {
return convert(identifier);
}

@Override
public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnv) {
return convert(identifier);
}

@Override
public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnv) {
return convert(identifier);
}

private Identifier convert(Identifier identifier) {
if (identifier == null || StringUtils.isBlank(identifier.getText())) {
return identifier;
}

String regex = "([a-z])([A-Z])";
String replacement = "$1_$2";
String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase();
return Identifier.toIdentifier(newName);
}
}

您可能需要调整正则表达式以满足您的具体需求,但这对我有用。

关于jpa - Hibernate 5 中的命名策略与 Hibernate 4 兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43373869/

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