2009-12-24 10 views

risposta

7

L'annotazione non è sufficiente perché l'ibernazione non sa dove vivono le classi annotate senza una sorta di dichiarazione esplicita. In teoria, potrebbe eseguire la scansione di ogni singola classe nel classpath e cercare l'annotazione, ma ciò sarebbe molto costoso per i progetti più grandi.

È possibile utilizzare spring che ha un helper che può consentire di specificare i pacchetti in cui si trovano gli oggetti di ibernazione e scansiona questi pacchetti per @Entity. Se hai tutti gli oggetti in un piccolo numero di pacchetti fissi, questo funziona bene.

E.g.

<bean id="referenceSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="packagesToScan"> 
     <array> 
     <value>com.xxx.hibernate.objects</value> 
     </array> 
    </property> 
    </bean> 

Quanto sopra è la dichiarazione di primavera. Se non hai familiarità con la sintassi precedente, puoi semplicemente costruirla a livello di codice.

AnnotationSessionFactoryBean sfb = new AnnotationSessionFactoryBean(); 
sfb.setDataSource(ds); 
sfb.setHibernateProperties(hibProps); 
sfb.setPackagesToScan(...); 
sfb.initialise(); 
SessionFactory sf = sfb.getObject(); 

supporta una serie di opzioni di configurazione in modo da poter utilizzare le proprietà prime o passare in un DataSource pre-config'd.

+0

si può anche usare 'LocalSessionFactoryBean' in questi giorni, che supporta fornendo un file' hibernate.cfg.xml' in caso di bisogno uno di quelli. Non sono sicuro di quale versione di primavera abbia ottenuto il metodo 'setPackagesToScan', ma ne ha sicuramente uno adesso. – Jules

3

Non si imposta la proprietà hibernate.archive.autodetection su true. Qui c'è un problema di prestazioni poiché Hibernate cercherà i file jar per l'annotazione JPA. Nota che inizializzerà anche quelle classi.

2

Sì :)

Il file hibernate.cfg.xml non viene utilizzato per specificare le entità, è utilizzato per configurare le cose come parametri di connessione di Hibernate e le impostazioni globali. Il file hibernate.cfg.xml contiene anche istruzioni su come individuare le entità. È possibile elencare i file di mapping XML utilizzando <mapping resource=XYZ>, ma se si utilizzano annotazioni JPA come @Entity, non è necessario, Hibernate li rileverà automaticamente.

È possibile aggiungere annotazioni e mappare XML se si sceglie, ma ciò non è assolutamente necessario nella maggior parte delle situazioni.

+1

"se si utilizzano annotazioni JPA come @Entity, questo non è necessario, Hibernate li rileverà automaticamente" - Non lo fa chiaramente per impostazione predefinita. Ottengo eccezioni di tipo entità non registrate se non le comunico sulle classi (utilizzo 'AnnotationConfiguration.addAnnotatedClass' per riferirle a livello di programma). Non sono sicuro di cosa sto sbagliando, ma non è del tutto automatico. – Jules

1

Per impostazione predefinita tutti correttamente annotati classi e tutti i file hbm.xml trovato all'interno dell'archivio vengono aggiunti alla configurazione dell'unità persistenza. L'utente può aggiungere un'entità esterna tramite l'elemento di classe .

Hibernate EntityManager Reference Docs

Problemi correlati