jack
jack

Reputation: 53

Failed to read schema document 'http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd

I'm writing a simple Swing app for university and using Hibernate and Oracle XE.

I'm stuck with that error:

 29.06.2011 14:54:10 org.hibernate.cfg.annotations.Version <clinit>
 INFO: Hibernate Annotations 3.3.1.GA
 29.06.2011 14:54:10 org.hibernate.cfg.Environment <clinit>
 INFO: Hibernate 3.2.5
 29.06.2011 14:54:10 org.hibernate.cfg.Environment <clinit>
 INFO: hibernate.properties not found
 29.06.2011 14:54:10 org.hibernate.cfg.Environment buildBytecodeProvider
 INFO: Bytecode provider name : cglib
 29.06.2011 14:54:10 org.hibernate.cfg.Environment <clinit>
 INFO: using JDK 1.4 java.sql.Timestamp handling
 29.06.2011 14:54:10 org.hibernate.ejb.Version <clinit>
 INFO: Hibernate EntityManager 3.3.2.GA
 29.06.2011 14:54:31 org.hibernate.ejb.packaging.PersistenceXmlLoader$ErrorLogger warning
 WARNING: Warning parsing XML: XML InputStream(2) schema_reference.4: Failed to read schema document 'http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd', because 1) could not find the document; 2) the document could not be read; 3) the root element of the      document is not <xsd:schema>.
 29.06.2011 14:54:52 org.hibernate.ejb.packaging.PersistenceXmlLoader$ErrorLogger warning

my persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="airportPU">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <class>my.airport.model.Crew</class>
    <class>my.airport.model.Country</class>
    <class>my.airport.model.City</class>
    <class>my.airport.model.Plane</class>
    <class>my.airport.model.Model</class>
    <class>my.airport.model.Passenger</class>
    <class>my.airport.model.Role</class>
    <class>my.airport.model.Airport</class>
    <class>my.airport.model.Spec</class>
    <class>my.airport.model.AverageFlightTime</class>
    <class>my.airport.model.CrewInTheRoleOnTheFlight</class>
    <class>my.airport.model.Flight</class>
    <class>my.airport.model.PassengersOnTheFlight</class>
    <properties>     
      <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@172.16.0.3:1521:XE"/>
      <property name="javax.persistence.jdbc.password" value="AIRPORT"/>
      <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
      <property name="javax.persistence.jdbc.user" value="AIRPORT"/>
    </properties>
  </persistence-unit>
</persistence>

Creating entity manager factory:

public static EntityManagerFactory emf;
public static EntityManager em;
static {
try {
    emf = Persistence.createEntityManagerFactory("airportPU");
    em = emf.createEntityManager();
} catch (Exception e) {     
    System.exit(1);
}
}

Upvotes: 5

Views: 13254

Answers (4)

Oswaldo
Oswaldo

Reputation: 523

As alternatives if you don't want to mess with hosts files, you could change the schemaLocation to a classpath resource, for instance

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee classpath:/com/sun/faces/web-facesconfig_2_0.xsd"

Or even to something random like

xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm http://java.sun.com.file.was.not.there.so.changed.so.hibernate.takes.its.own.xsd.from.classpath.or.ignores.the.validation/xml/ns/persistence/orm_2_0.xsd"

Upvotes: 0

rdguam
rdguam

Reputation: 356

Adding to @Szocske's answer, Hibernate seems to want to retrieve the JPA 2.0 xsd from the Internet if it doesn't recognize that version.

My older Hibernate 3.2 jars were trying to connect to the Internet when I inadvertently used a persistence.xml that specified a version 2.0 xsd. So, if Hibernate is behaving that way for you, it might indicate a version mismatch between your XMLs and your Hibernate jars.

Upvotes: 1

Szocske
Szocske

Reputation: 7661

Bottom line: adding this line to the /etc/hosts file solves this:

127.0.0.1 java.sun.com

It seems Hibernate recognizes this and other "standard" XSD-s as something it has, and has no problem working with its internal copy without Internet access.

Problems arise when the HTTP GET for the XSD does not succeed, but does not fail either: Returns something else or takes forever to respond. Hibernate is not prepared for these situations. Right now the URL takes forever to respond, and Hibernate does not employ a quick timeout as it should for situations like today.

Systems without Internet access are unaffected.

So as a solution I am emulating lack of Internet access by resolving the java.sun.com hostname to the loopback interface IP address, guaranteeing a quick failure.

Upvotes: 11

NimChimpsky
NimChimpsky

Reputation: 47310

the link is down where did you get the reference for it, double check it... the http ref should work but obviously isn't as it does not exist.

A quick google suggests there is a glitch in the matrix (oracle servers).

Upvotes: 2

Related Questions