Как программно связать Hibernate Type для выбранных полей сущностей? - PullRequest
5 голосов
/ 23 апреля 2019

Я ищу способ привязки Type к конкретным полям сущностей на этапе настройки диспетчера сущностей. Мне нужно, чтобы он мог применять дополнительные «правила» к целевому полю сущности, используя внешний источник без изменений класса сущности.

Так что в основном я стараюсь избегать жесткого кода @Type аннотации, как показано ниже:

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

Вместо этого я хотел бы установить Тип для someField при программном построении модели.

1 Ответ

2 голосов
/ 27 апреля 2019

Вот один из способов, который я видел раньше. Это немного низкий уровень, поэтому я подозреваю, что есть более чистый способ сделать это.

Здесь используется пользовательский Persister в Hibernate, чтобы позволить нам подставлять тип при создании SessionFactory (EntityManagerFactory).

Сначала аннотация @Persister используется для объявления пользовательского Persister:

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

    private String someField;

Тогда обычно пользовательский персистер должен расширяться SingleTableEntityPersister в Hibernate. Если объект использует другой @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(), вероятно, является хорошей отправной точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...