2015-01-22 13 views
5

In un progetto su cui lavoro non utilizzo Spring, utilizzo solo Hibernate. Non voglio usare i file hbm.xml per mappature/descrizioni di entità/ecc. Voglio usare solo le annotazioni.hibernate 4.3.x - carica tutte le classi annotate entità

Come dire a Hibernate di caricare tutte le classi annotate da Entity/Table da determinati pacchetti?

Ho cercato sul web ma non ho fortuna. Inoltre non trovo informazioni sull'ultima versione di Hibernate (per lo più articoli obsoleti/post/ecc.).

Edit 1:

http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#mapping

La pagina doc Hibernate dice questo:

Oggetto/mappature relazionali possono essere definiti in tre approcci:
1) utilizzando Java 5 annotazioni (tramite le annotazioni di Java Persistence 2)
2) utilizzando i descrittori di distribuzione XML di JPA 2 (descritti nel capitolo XXX)
3) utilizzando i file legacy XML Hibernate approccio noto come hbm.xml

Allora è così, voglio solo utilizzare 1) con il SessionFactory/Session Hibernate API.

Edit 2:

Anche se le mie domande è stato contrassegnato come duplicato, non è, perché non voglio usare JPA (ei descrittori implicite), ma solo avvicinarsi a 1) da quelli elencati sopra .

+0

@hwellmann Che cosa succede se non si desidera avere persistence.xml ma solo hibernate.cfg.xml? Devo avere entrambi? Volevo solo hibernate.cfg.xml con il comportamento di Hibernate che analizzava le classi di entità annotate. Non è possibile ?! –

+0

@VladMihalcea Che cosa succede se non desidero avere persistence.xml ma solo hibernate.cfg.xml? Devo avere entrambi? Volevo solo hibernate.cfg.xml con il comportamento di Hibernate che analizzava le classi di entità annotate. Non è possibile ?! –

+0

In altre parole ho pensato con quelle annotazioni nelle classi di entità, posso semplicemente evitare di utilizzare i file di mappatura .hbm.xml e utilizzare ancora le API SessionFactory & Session fornite da Hibernate e avere queste API a conoscenza delle mie classi di entità. Qualche idea su come raggiungerlo più facilmente? –

risposta

6

OK, questo non è possibile in Hibernate 4.3.x e non è mai stato possibile.

Vedi anche questa domanda/risposta (anche se questo post è vecchio, è abbastanza valido):
Add Annotated Class in Hibernate by adding all classes in some package. JAVA

1) Dopo che ho fatto qualche ricerca su questo, sembra si tratta di un malinteso comune che Configuration.addPackage ci permette per caricare tutte le classi di entità da un determinato pacchetto. Non è vero. L'ho trovato nel modo più duro osservando le fonti di ibernazione e solo allora ho trovato la domanda/risposta SO sopra che lo ha confermato. In effetti non sono abbastanza sicuro di ciò che fa addPackage, ma non sembra molto utile per il mio caso.

2) Sembra che una cosa che possiamo fare è chiamare Configuration.addAnnotatedClass per ciascuna delle nostre classi di entità annotate, ad es. hard-coding quelle classi in fase di compilazione. Oppure ... in alternativa usando Reflections o Guava possiamo trovare tutte le classi di entità (ad esempio nostre) da un determinato pacchetto dinamicamente in fase di runtime, eseguirne il looping e chiamare ancora Configuration.addAnnotatedClass. L'unico problema con Reflections è che ha alcune dipendenze diverse. Quindi dobbiamo aggiungere 9 nuovi JAR per questa cosa semplice (che dolore) se decidiamo di usare Reflections. Con Guava è un po 'più facile, possiamo semplicemente chiamare
ClassPath.from ( Thread.currentThread().getContextClassLoader() ). getTopLevelClasses(pckg).

Se qualcuno ha un approccio migliore, sentitevi liberi di fornirlo.
Accetterò la risposta migliore, non necessariamente la mia risposta.

+0

Ho appena passato questo mal di testa da solo. A cominciare da quello che sembrava essere l'ovvio "addPackage". Tuttavia, ho finito per utilizzare ancora addPackage dopo aver aggiunto tutte le classi con il codice sopra. Legge i metadati a livello di pacchetto (pacakge-info.java) in cui inserisco alcune annotazioni per i tipi personalizzati. –