【问题标题】:How to programmatically bind Hibernate Type for selected entity fields?如何以编程方式为选定的实体字段绑定休眠类型?
【发布时间】:2019-09-12 14:07:03
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你能解释一下吗

标签: java hibernate hibernate-mapping


【解决方案1】:

这是我以前见过的一种方式。它有点低级,所以我怀疑有一种更清洁的方法可以做到这一点。

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

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

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

    private String someField;

那么通常自定义持久化器应该在 Hibernate 中扩展 SingleTableEntityPersister。如果实体使用不同的@Inheritance(strategy),则它可能需要扩展JoinedSubclassEntityPersister 或UnionSubclassEntityPersister。

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

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() 可能是一个很好的起点。

【讨论】:

  • 不知道这样的做法,谢谢分享。然而,虽然它改善了我目前的情况,但我仍然需要使用正确的持久化器手动注释每个实体(用于不同的继承策略支持)。
  • 我能够使用这种方法以及注册自己的 PersisterClassResolver 来覆盖完全不改变实体的类型。
猜你喜欢
  • 2020-11-10
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多