Questa domanda è specificamente circa programmazione la creazione di un JPA EntityManagerFactory
sostenuta da Hibernate 5, che significa senza file di configurazione XML e senza l'utilizzo di primavera. Inoltre, questa domanda è nello specifico sulla creazione di uno EntityManagerFactory
con un Hibernate Interceptor.JPA con Hibernate 5: a livello di codice creare EntityManagerFactory
so come creare un Hibernate SessionFactory
come voglio, ma non voglio un Hibernate SessionFactory
, voglio un JPA EntityManagerFactory
sostenuta da un Hibernate SessionFactory
. Dato un EntityManagerFactory
c'è un modo per ottenere il sottostante SessionFactory
, ma se quello che hai è un SessionFactory
e tutto quello che vuoi è un wrapper EntityManagerFactory
attorno ad esso, sembra che sei sfortunato.
con Hibernate versione 4.2.2 Ejb3Configuration
era già deprecato, ma non sembrava esserci altro modo per creare a livello di codice un EntityManagerFactory
, quindi stavo facendo qualcosa di simile:
@SuppressWarnings("deprecation")
EntityManagerFactory buildEntityManagerFactory(
UnmodifiableMap<String,String> properties,
UnmodifiableCollection<Class<?>> annotatedClasses,
Interceptor interceptor)
{
Ejb3Configuration cfg = new Ejb3Configuration();
for(Binding<String,String> binding : properties)
cfg.setProperty(binding.key, binding.value);
for(Class<?> annotatedClass : annotatedClasses)
cfg.addAnnotatedClass(annotatedClass);
cfg.setInterceptor(interceptor);
return cfg.buildEntityManagerFactory();
}
con Hibernate 4.3.0 Ejb3Configuration
è stato rimosso, così ho dovuto fare uso di questo hack: (. si tratta di un hack perché sto istanziare EntityManagerFactoryImpl
che si trova nel pacchetto org.hibernate.jpa.internal
)
EntityManagerFactory buildEntityManagerFactory(
UnmodifiableMap<String,String> properties,
UnmodifiableCollection<Class<?>> annotatedClasses,
Interceptor interceptor)
{
Configuration cfg = new Configuration();
for(Binding<String,String> binding : properties)
cfg.setProperty(binding.key, binding.value);
for(Class<?> annotatedClass : annotatedClasses)
cfg.addAnnotatedClass(annotatedClass);
cfg.setInterceptor(interceptor);
StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder();
ssrb.applySettings(cfg.getProperties()); //??? why again?
ServiceRegistry serviceRegistry = ssrb.build();
return new EntityManagerFactoryImpl(PersistenceUnitTransactionType.RESOURCE_LOCAL, /**/
/*discardOnClose=*/true, /*sessionInterceptorClass=*/null, /**/
cfg, serviceRegistry, null);
}
Ora, con Hibernate 5 hanno cambiato il costruttore di EntityManagerFactoryImpl
, quindi il codice sopra riportato non funziona. Posso sprecare qualche ora cercando di capire come impostare le cose in modo da poter invocare quel costruttore, ma sono sicuro che dopo un paio di versioni di Hibernate, non funzionerà più neanche così.
Quindi, questa è la mia domanda:
Qualcuno sa di un modo bello e pulito di implementare questa funzione
EntityManagerFactory buildEntityManagerFactory(
UnmodifiableMap<String,String> properties,
UnmodifiableCollection<Class<?>> annotatedClasses,
Interceptor interceptor)
in modo da creare un Hibernate EntityManagerFactory
programmazione, che significa senza file xml di configurazione e senza utilizzare la primavera ma con un Hibernate Interceptor?
C'è questa vecchia domanda: Hibernate create JPA EntityManagerFactory with out persistence.xml ma ha una risposta per una versione precedente di Hibernate, che è già stata anticipata in questa domanda. Non lo farò, perché voglio che funzioni con Hibernate 5, e idealmente, in un modo che non usi nulla di deprecato o di interno, in modo da avere alcune possibilità di lavorare per molto tempo a venire.
Avete veramente bisogno l'intercettore (che rendono difficile per registrare per un motivo). Cosa c'è di così speciale che non può essere sostituito con un EventListener JPA e funziona senza hack, soluzioni alternative, ecc. –
@ M.Deinum JPA vuole istanziare i miei ascoltatori di entità da solo, richiedendo loro di avere costruttori senza parametri. Questo è inaccettabile, per usare un eufemismo. Hibernate mi consente di fornire l'istanza effettiva del mio intercettore, così posso costruirla nel modo che voglio. Inoltre, gli ascoltatori dell'entità JPA non mi permettono di istanziare le mie stesse entità. Di nuovo, Hibernate Interceptor mi dà la libertà di istanziare le mie stesse entità. Questo è di fondamentale importanza. Per ulteriori informazioni, consultare http://stackoverflow.com/a/29433238/773113 –
@MikeNakis Hai provato a contattare il gruppo dev? Hai risolto quella situazione? Ho un problema molto simile al tuo. – message