gpt4 book ai didi

Hibernate 5 隐式命名策略

转载 作者:行者123 更新时间:2023-12-01 09:20:53 25 4
gpt4 key购买 nike

我想使用 hibernate 5.x。在 hibernate 5.x 中,ImplicitNamingStrategy 有了新的接口(interface)。和 PhysicalNamingStrategy .

房产 name一个实体的 User我想要一个列名user_name在我的数据库中。我不想用 @Column(name="...") 注释每个属性.我试图写一个自定义ImplicitNamingStrategy但没有办法获得拥有实体的名称。

public class MyNamingStrategy extends ImplicitNamingStrategyComponentPathImpl
{
@Override
public Identifier determineBasicColumnName ( ImplicitBasicColumnNameSource source )
{
// How to get the name of the owning entity?
String owningEntityName = "howdoigetthis";
Identifier basicColumnName = super.determineBasicColumnName(source);
Identifier identifier = Identifier.toIdentifier(owningEntityName +"_" + basicColumnName.toString());
return identifier;
}
}

有没有办法通过仅使用 NamingStrategy 为每一列添加表(或实体)名称的前缀?

最佳答案

如果您不介意一些肮脏的反射,这是一个解决方案:

@Override
public Identifier determineBasicColumnName(final ImplicitBasicColumnNameSource source)
{
// Get 'this$0' field and make it accessible
Field ejb3ColumnField = null;
final Field[] sourceFields = source.getClass().getDeclaredFields();
for (final Field sourceField : sourceFields) {
if (sourceField.getName().equals("this$0")) {
ejb3ColumnField = sourceField;
}
}
ejb3ColumnField.setAccessible(true);

// Get actual field object
String owningEntityName;
Ejb3Column ejb3Column;
try {
ejb3Column = (Ejb3Column) ejb3ColumnField.get(source);
} catch (
IllegalArgumentException
| IllegalAccessException e) {
throw new RuntimeException(e); // (Or deal with this appropriately, e.g. log it.)
}

// The property holder path holds the owning entity's fully qualified name
final String owningEntityFullyQualifiedName = ejb3Column.getPropertyHolder().getPath();

// The entity name is after the last dot in the fully qualified name
final String[] owningEntityTokens = owningEntityFullyQualifiedName.split("\\.");
owningEntityName = owningEntityTokens[owningEntityTokens.length - 1];

final Identifier basicColumnName = super.determineBasicColumnName(source);
return Identifier.toIdentifier(owningEntityName + "_" + basicColumnName.toString());
}

关于Hibernate 5 隐式命名策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33111949/

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