2013-06-14 7 views
6

Il nostro progetto utilizza la programmazione programmabile di Hibernate Configuration per configurare SessionFactory e così via. Mi sono appena trasferito dalla versione 3 alla versione 4 di Hibernate. Ora sto ricevendo l'errore "Tipo di elemento" hibernate-mapping "deve essere dichiarato." che dice è una SaxParseException. È fantastico e tutto, ma ho controllato la mia directory WEB-INF/lib e il file .jar di core 4 di versione 4 di Hibernate, quindi è sul classpath.Errore di ibernazione, possibilmente con la dichiarazione DTD

In un primo momento ho pensato che sia perché squadra di Hibernate migrato da

<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

a

<!DOCTYPE hibernate-mapping PUBLIC 
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

Ma questo non risolve l'errore. Cosa sta succedendo? In un progetto separato in cui sto usando il file di configurazione XML per Hibernate, ho fatto la stessa migrazione, ed è andata bene. Si prega di notare che nel mio ambiente deve essere usato classpath, il DTD non può essere scaricato da internet o qualcosa del genere. Non dovrebbe essere comunque.

edit: ecco l'eccezione come richiesto:

Caused by: org.xml.sax.SAXParseException; systemId: ; lineNumber: 6; columnNumber: 20; Element type "hibernate-mapping" must be declared. 
     at org.apache.xerces.framework.XMLParser.reportError(XMLParser.java:1213) 
     at org.apache.xerces.validators.common.XMLValidator.reportRecoverableXMLError(XMLValidator.java:1807) 
     at org.apache.xerces.validators.common.XMLValidator.validateElementAndAttributes(XMLValidator.java:3633) 
     at org.apache.xerces.validators.common.XMLValidator.callStartElement(XMLValidator.java:1229) 
     at org.apache.xerces.framework.XMLDocumentScanner$ContentDispatcher.dispatch(XMLDocumentScanner.java:938) 
     at org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:381) 
     at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1098) 
+0

è possibile inviare la traccia eccezione per favore, l'eccezione SAXParser sarebbe anche dire che cosa è andato storto .. –

+0

@AnanthaSharma Ok ho postato .. – KyleM

+0

è questo il file hibernate.cfg.xml o hbm.xml file .. la voce di mappatura di ibernazione arriva nei file hbm.xml, puoi provare con questo ' –

risposta

10

Ho anche appena migrato 3,0-4,0, suppongo 3 cause che uso il seguente

la correzione REALE del DTD IN QUESTO CASO

Assicurati di non avere alcun vecchio jar 3.0 nel percorso, altrimenti puoi vedere questa eccezione.

Possibile causa 1

Per hibernate.cfg.xml

<?xml version='1.0' encoding='UTF-8'?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 

E per i file HBM

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

funziona bene per me.

Possibile causa 2

Hai errore di ortografia <hibernate-mapping> nel file HBM.

Modifica:

Sto usando configurazione mista file sia programmatiche e CFG. Quando ho provato a utilizzare tutto il programmatic, non ha funzionato per me. Né ho ricevuto molto aiuto da SO. Ma il sotto funzionava per me.

try { 
    String connection = "jdbc:mysql://" 
      + Globals.DBSERVER.trim() 
      + "/myDB?autoReconnect=true&failOverReadOnly=false&maxReconnects=10"; 
    log.debug("Connection URL "+connection) ; 
    Configuration configuration = new Configuration(); 
    configuration 
      .setProperty("hibernate.connection.url", connection) 
      .setProperty("hibernate.connection.username", Globals.DB_USER_NAME.trim()) 
      .setProperty("hibernate.connection.password", Globals.DB_PASSWORD.trim()) 
     ; 
    configuration.configure(); 
     sessionFactory = configuration 
      .buildSessionFactory(new ServiceRegistryBuilder() 
      .applySettings(configuration.getProperties()).buildServiceRegistry()); 

       } catch (Exception e) { 
        log.fatal("Unable to create SessionFactory for Hibernate"); 
        log.fatal(e.getMessage()); 
        log.fatal(e); 
        e.printStackTrace(); 
       } 

Il mio question mi ha aiutato a risolverlo.

Consigli complesso

Andando tutto programmatica è una cattiva idea. Dato che ci sono molte cose programmatiche, è necessario aggiungere dalla colonna alla variabile mapping al tipo di variabile. Sarà un incubo di debug. Suggerisco di fare non di cose programmatiche per cose che puoi fare senza programmatico.Per me ho solo bisogno di ottenere la password del nome utente dalla linea cmd, in modo da poter distribuire il prodotto su qualsiasi server. Quindi l'ho appena programmato.

+0

Nella domanda si afferma chiaramente che non sto utilizzando .cfg.xml, sto usando la configurazione programmatica ... la versione .dtd della configurazione deve corrispondere alla versione .dtd della mappatura di ibernazione? per esempio. devono essere entrambi v3.0? Non penso che lo facciano, quindi non vedo come questo sia rilevante .. DTD descrive solo sintassi/struttura del file XML, giusto? – KyleM

+0

Btw, esaminerò la possibile causa 2. Grazie per il post. – KyleM

+0

Ho visto SAXException, per favore continuate a pazientare, ci sono un sacco di cose che sono andate storte, e non ricordo quale cambiamento ha corretto quale eccezione (francamente non mi interessa), sto solo cercando di ricordare tutto ciò che ho fatto in quel tempo per risolvere il mio problema. Fidati di me funziona, quindi ci arriveremo. – Siddharth

1

Ho anche la migrazione da Hibernate 3 a 4,

Per file di hibernate.cfg.xml io uso seguente DTD

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

Per file di mapping che uso follwing DTD:

<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

Se cambio dtd dà un'eccezione perché hibernate 4 usa xsd invece di dtd. Hibrenate Jira of migrating dtd to xsd

Quindi è necessario utilizzare il file xsd invece di dtd.

Hibernate hbm example

+1

No, non lo fai. Questa informazione contraddice direttamente la documentazione di Hibernate che dice che è ancora possibile utilizzare il DTD 3.0. Inoltre, ho corretto tutto ieri come menzionato nei commenti sul mio post ... quindi tutto ora funziona utilizzando il DTD 3.0. – KyleM

Problemi correlati