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