2017-02-07 1 views
0

Ich entwickle eine Web App und stelle sie auf Tomcat 7.0 bereit. Meine App verwendet eine MySQL-Datenbank. Ich habe bereits die Verbindung zwischen App und Datenbank konfiguriert und wollte Hibernate 5.2.5-Unterstützung hinzufügen. Ich kann kommunizieren mit der Datenbank über Hibernate-Konsole mit Konfiguration unten, und es funktioniert, wenn ich es in Nicht-Web-App verwenden. Das Problem ist nur, wenn ich es auf dem Server bereitstellen. Ich bekomme eine WarnungTomcat + Hibernate = keine persistenten Klassen für die Abfrageklasse gefunden

no persistent classes found for query class: from entities.UserH 

und dann 500 Serverfehler durch sie verursacht.

Meine Entitätsklasse:

@Entity 
@Table(name = "users", uniqueConstraints = {@UniqueConstraint(columnNames =  {"id"})}) 
public class UserH { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id", nullable = false, unique = true, length = 11) 
    private int id; 
    @Column(name = "login", nullable = false, length = 45) 
    private String login; 
    @Column(name = "name", nullable = false, length = 45) 
    private String name; 
    @Column(name = "surname", nullable = false, length = 45) 
    private String surname; 

    /* getters and setters*/ 
} 

Mein Hibernate-annotation.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
     <!-- Database connection properties - Driver, URL, user, password --> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/web-database</property> 
     <property name="hibernate.connection.username">username</property> 
     <property name="hibernate.connection.password">password</property> 

     <!-- org.hibernate.HibernateException: No CurrentSessionContext configured! --> 
     <property name="hibernate.current_session_context_class">thread</property> 

     <!-- Mapping with model class containing annotations --> 
     <mapping class="entities.UserH"/> 
    </session-factory> 
</hibernate-configuration> 

Methode, die Benutzer erhalten sollten:

public List<UserH> getAllUsers() { 

    try (Session session = HibernateUtils.getSessionAnnotationFactory().getCurrentSession()) { 
     session.beginTransaction(); 
     Query<UserH> usersQuery = session.createQuery("from entities.UserH", UserH.class); 
     List<UserH> usersList = usersQuery.getResultList(); 

     session.getTransaction().commit(); 

     return usersList; 
    } 
} 

Wie ich bereits erwähnt - es funktioniert ok mit normaler App, aber nicht mit Tomcat. Ich habe alle verfügbaren Elemente zu Webartefakten hinzugefügt, aber es hat nicht geholfen. Ich habe sogar versucht, JPA-Unterstützung mit persistance.xml hinzuzufügen, aber immer noch ohne Glück.

Was könnte sonst noch das Problem sein?

edit: Meine HibernateUtils Klasse:

public class HibernateUtils { 
    private static SessionFactory sessionAnnotationFactory; 

    private static SessionFactory buildSessionAnnotationFactory() { 
     try { 
      // Create the SessionFactory from hibernate.cfg.xml 
      Configuration configuration = new Configuration(); 
      configuration.configure("hibernate-annotation.cfg.xml"); 
      System.out.println("Hibernate Annotation Configuration loaded"); 

      ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build(); 
      System.out.println("Hibernate Annotation serviceRegistry created"); 

      SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); 

      return sessionFactory; 
     } catch (Throwable ex) { 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionAnnotationFactory() { 
     if (sessionAnnotationFactory == null) 
      sessionAnnotationFactory = buildSessionAnnotationFactory(); 
     return sessionAnnotationFactory; 
    } 
} 
+0

Bitte geben Sie Ihren 'HibernateUtils' Klassencode an. – Naros

+0

@Naros, ich habe meinen Beitrag bearbeitet. – Mohru

Antwort

0

Vielleicht ist das keine richtige Antwort fot meine Frage, aber das ist, was wirklich für mich gearbeitet. Ich habe Hibernate durch JPA-Konfiguration + Hibernate ersetzt.

Statt hibernate- annotation.cfg.xml der Verwendung + Session verwendet I persistance.xml + EntityManager:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 

    <persistence-unit name="NewPersistenceUnit" transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <class>entities.UserH</class> 

     <properties> 
      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/web-database"/> 
      <property name="javax.persistence.jdbc.user" value="Admin"/> 
      <property name="javax.persistence.jdbc.password" value="[email protected]"/> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/> 
      <property name="hibernate.hbm2ddl.auto" value="update"/> 
     </properties> 
    </persistence-unit> 

</persistence> 

getEntityManager:

public static EntityManager getEntityManager() { 
    EntityManager entityManager = Persistence 
      .createEntityManagerFactory("NewPersistenceUnit") 
      .createEntityManager(); 

    return entityManager; 
} 

getAllUsers:

public List<UserH> getAllUsers() { 

    EntityManager entityManager = HibernateUtils.getEntityManager(); 
    EntityTransaction transaction = entityManager.getTransaction(); 
    transaction.begin(); 
    TypedQuery<UserH> usersQuery = entityManager.createQuery("from UserH ", UserH.class); 
    List<UserH> usersList = usersQuery.getResultList(); 
    transaction.commit(); 
    entityManager.close(); 

    return usersList; 
} 

Allerdings verstehe ich immer noch nicht, warum diese Konfigurationen funktionieren, während der Winterschlaf alleine nicht funktioniert. Irgendwelche Kommentare/Vorschläge würden geschätzt.

0

Sie sollten nur Ihre Abfrage ändern nur den Klassennamen verweisen:

session.createQuery("FROM UserH", UserH.class) 

Das einzige Mal, das Paket ist wichtig wäre, wenn du bist Definieren von Entitäten als innere Klassen.

In diesen Fällen müssen Sie den vollständigen Klassennamen verwenden. Eine weitere Alternative ist die @Entity Anmerkung zu ändern, so dass es die Attributnamen enthält, so dass Sie ausdrücklich Ihre Entity-Klasse nennen:

public class SomeOutterClass { 
    @Entity(name = "MyEntity") 
    public static class MyEntity { 

    } 
} 
+0

Meine Klasse ist keine innere Klasse.Wenn ich den Paketteil von der Abfrage entferne, bekomme ich einen Fehler: 'QuerySyntaxException: UserH ist nicht [von UserH] zugeordnet. Es passiert sogar, wenn ich den Namen in '@ Entity' Annotation angeben. – Mohru

Verwandte Themen