Вот один из способов, который я видел раньше. Это немного низкий уровень, поэтому я подозреваю, что есть более чистый способ сделать это.
Здесь используется пользовательский 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()
, вероятно, является хорошей отправной точкой.