gpt4 book ai didi

java - 如何以编程方式为选定的实体字段绑定(bind) Hibernate 类型?

转载 作者:搜寻专家 更新时间:2023-10-31 20:24:52 26 4
gpt4 key购买 nike

我正在寻找一种在实体管理器配置阶段为特定实体字段绑定(bind) Type 的方法。我需要它能够在不更改实体类的情况下使用外部源将额外的“规则”应用于目标实体字段。

所以基本上我试图避免硬编码 @Type 注释方式如下:

@Type(type = foo.package.MyType, parameters = {
@Parameter(name = "fooProperty", value = "fooValue")
})
private String someField;

相反,我想在以编程方式构建模型时为 someField 设置类型。

最佳答案

这是我以前见过的一种方式。它有点低级,所以我怀疑有更简洁的方法来执行此操作。

这使用自定义 Persister在 Hibernate 中允许我们在 SessionFactory 时替换类型( EntityManagerFactory ) 正在创建中。

首先,@Persister注释用于声明自定义 Persister :

@Entity
@Persister(impl = MyPersister.class)
public class EntityWithPersister {

private String someField;

然后通常自定义持久化应该扩展 SingleTableEntityPersister在 hibernate 中。如果实体使用不同的 @Inheritance(strategy) , 那么它可能需要扩展 JoinedSubclassEntityPersisterUnionSubclassEntityPersister相反。

这提供了在构造点更改类型的机会,例如:

public class MyPersister extends SingleTableEntityPersister {

public MyPersister(PersistentClass persistentClass,
EntityDataAccess cacheAccessStrategy,
NaturalIdDataAccess naturalIdRegionAccessStrategy,
PersisterCreationContext creationContext)
throws HibernateException {
super(modify(persistentClass), cacheAccessStrategy,
naturalIdRegionAccessStrategy, creationContext);
}

private static PersistentClass modify(PersistentClass persistentClass) {
SimpleValue value = (SimpleValue) persistentClass
.getProperty("someField").getValue();
value.setTypeName(MyType.class.getName());
return persistentClass;
}
}

如果您需要访问更多您所在的上下文,creationContext.getSessionFactory()可能是一个很好的起点。

关于java - 如何以编程方式为选定的实体字段绑定(bind) Hibernate 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55810356/

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