如何以编程方式绑定所选实体字段的Hibernate类型?

问题描述 投票:5回答:1

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

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

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

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

java hibernate hibernate-mapping
1个回答
2
投票

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

这在Hibernate中使用自定义Persister,允许我们在创建SessionFactoryEntityManagerFactory)时替换类型。

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

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

    private String someField;

然后通常自定义持久化应该在Hibernate中扩展SingleTableEntityPersister。如果实体使用不同的@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()可能是一个很好的起点。

© www.soinside.com 2019 - 2024. All rights reserved.