2013-06-14 11 views
6

Dự án sử dụng Hibernate có lập trình Configuration của chúng tôi để thiết lập SessionFactory của chúng tôi và như vậy. Tôi vừa di chuyển chúng ta từ phiên bản 3 sang phiên bản 4 của Hibernate. Bây giờ tôi nhận được lỗi "Element type" hibernate-mapping "phải được khai báo." mà nó nói là một SaxParseException. Điều đó thật tuyệt vời và tất cả, nhưng tôi đã kiểm tra thư mục WEB-INF/lib của mình và tệp .jar của phiên bản Hibernate phiên bản 4 có ở đó, vì vậy nó nằm trên đường dẫn lớp.Lỗi Hibernate, có thể với khai báo DTD

Lúc đầu, tôi nghĩ đó là vì Hibernate nhóm di cư từ

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

để

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

Nhưng điều đó không khắc phục lỗi. Chuyện gì vậy? Trong một dự án riêng biệt mà tôi đang sử dụng tệp cấu hình XML cho Hibernate, tôi đã thực hiện di chuyển tương tự, và nó đã ổn. Xin lưu ý rằng trên đường dẫn môi trường của tôi phải được sử dụng, DTD không thể được tải về từ internet hoặc bất cứ điều gì như thế. Nó không phải là anyway.

chỉnh sửa: đây là ngoại lệ theo yêu cầu:

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

bạn có thể đăng các dấu vết ngoại lệ xin vui lòng, ngoại trừ SAXParser cũng sẽ nói những gì đã xảy ra .. –

+0

@AnanthaSharma Ok tôi đăng nó .. – KyleM

+0

đây có phải là tập tin hibernate.cfg.xml hoặc hbm.xml tập tin .. các mục nhập hibernate-ánh xạ đến trong các tập tin hbm.xml, bạn có thể thử với điều này '' –

Trả lời

10

Tôi cũng chỉ cần di chuyển 3,0-4,0, tôi giả sử 3 nguyên nhân tôi sử dụng sau

THE FIX THỰC TẾ DTD trong trường hợp này

Hãy chắc chắn rằng bạn không có bất kỳ cũ 3.0 jar trong đường dẫn, nếu không bạn có thể thấy ngoại lệ này.

thể Nguyên nhân 1

Đối 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"> 

Và đối với các 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"> 

trình tốt cho tôi.

thể Nguyên nhân 2

Bạn đã viết sai thành <hibernate-mapping> trong file hbm của bạn.

Edit:

Tôi đang sử dụng cấu hình hỗn hợp cả hai chương trình và cfg tập tin. Khi tôi cố gắng sử dụng tất cả các chương trình, nó không làm việc cho tôi. Tôi cũng không nhận được nhiều sự trợ giúp từ SO. Nhưng bên dưới đã làm việc cho tôi.

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(); 
       } 

My question đã giúp tôi khắc phục sự cố.

Lời khuyên chung

Đi tất cả các chương trình là một ý tưởng tồi. Vì có rất nhiều thứ có lập trình bạn cần phải thêm từ cột này sang ánh xạ biến khác cho kiểu biến. Nó sẽ là một cơn ác mộng gỡ lỗi. Tôi khuyên bạn nên làm không nội dung có lập trình cho những việc bạn có thể làm mà không cần lập trình.Đối với tôi, tôi chỉ cần lấy mật khẩu tên người dùng từ dòng cmd, để tôi có thể triển khai sản phẩm trên bất kỳ máy chủ nào. Vì vậy, tôi chỉ làm cho chương trình đó.

+0

Nó được nêu rõ trong câu hỏi rằng tôi không sử dụng .cfg.xml, tôi đang sử dụng Cấu hình có lập trình ... phiên bản .dtd từ cấu hình có khớp với phiên bản .dtd từ bản đồ ngủ đông không? ví dụ. cả hai đều phải là v3.0? Tôi không nghĩ rằng họ làm, vì vậy tôi không thấy làm thế nào điều này là có liên quan .. DTD chỉ mô tả cú pháp/cấu trúc của tập tin XML, phải không? – KyleM

+0

Btw, tôi sẽ xem xét nguyên nhân có thể 2. Cảm ơn bài đăng. – KyleM

+0

Tôi đã thấy SAXException, hãy tiếp tục giữ kiên nhẫn, có rất nhiều thứ đã đi sai, và tôi không nhớ những gì thay đổi cố định những gì ngoại lệ (thẳng thắn tôi không quan tâm), tôi chỉ cố gắng nhớ lại tất cả những gì tôi đã làm ở đó thời gian để khắc phục sự cố của tôi. Hãy tin tôi làm việc, vì vậy chúng tôi sẽ đến đó. – Siddharth

1

Tôi cũng di chuyển từ chế độ ngủ đông 3-4,

Đối với hồ hibernate.cfg.xml tôi sử dụng sau DTD

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

Đối với tập tin bản đồ tôi sử dụng follwing DTD:

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

Nếu tôi thay đổi dtd, nó cung cấp ngoại lệ vì hibernate 4 sử dụng xsd thay vì dtd. Hibrenate Jira of migrating dtd to xsd

Vì vậy, bạn phải sử dụng tệp xsd thay vì dtd.

Hibernate hbm example

+1

Không, bạn không có. Thông tin này trực tiếp mâu thuẫn với tài liệu Hibernate cho biết bạn vẫn có thể sử dụng 3.0 DTD. Hơn nữa, tôi đã khắc phục mọi thứ ngày hôm qua như đã đề cập trong các nhận xét trên bài đăng của tôi ... vì vậy mọi thứ hiện đang hoạt động bằng cách sử dụng 3.0 DTD. – KyleM