# Probleme mit Enterprise Anwendung



## Krusty (28. Nov 2009)

Hallo,

seit ein paar Tagen versuche ich mit Hilfe einer selbsterstellten kleinen Java EE Webapplikation unter anderem EJB und JPA näher kennenzulernen. Zu diesem Zweck erzeugte ich mit der Eclipse IDE vier Projekte:

Enterprise Application Project
Dynamic Web Project
EJB Project
JPA Project
Wenn ich das Deployment auf meinem JBoss Application Server veranlasse, schreibt er unter anderem folgendes in die Datei server.log:


```
org.hibernate.hql.ast.QuerySyntaxException: Articles is not mapped [SELECT a FROM Articles a]
...
ERROR [AbstractKernelController] Error installing to Start: name=persistence.unit:unitName=BlogApp.ear/BlogJPA.jar#BlogJPA state=Create
javax.persistence.PersistenceException: [PersistenceUnit: BlogJPA] Unable to build EntityManagerFactory
...
org.hibernate.HibernateException: Errors in named queries: findAllArticles
```

Hinweis: Anstelle der "..."-Einfügungen stehen in der Log-Datei Exceptions

Meine selbst gewählte Arbeitsumgebung:

Windows 7 64-Bit
JDK 6 64-Bit
Eclipse Galileo Java EE Developer
Apache Derby 10.5.3.0 (Embedded)
JBoss 5.1.0 AS

derby-ds.xml (im Archiv) im Verzeichnis jboss\server\default\deploy
derby.jar im Verzeichnis jboss\server\default\lib
Derby-Datenbank im Verzeichnis jboss\server\default\data

Gestern meldete mir der JBoss nur Probleme bzgl. EJB. Heute legte ich die Projekte noch einmal neu an, worauf JBoss beim anschliessenden Bereitstellen der Anwendung plötzlich nur über JPA-Schwierigkeiten berichtet. Dies hielt mich davon ab, diesen Thread in einem spezielleren Unterforum zu eröffnen.

Die Dateien der Projekte aus meinem workspace wurden von mir als Archiv angehängt. Zudem ist dort auch die server.log des JBoss zu finden. 

Was mache ich falsch?:bahnhof:

Gruß

Krusty


----------



## maki (29. Nov 2009)

> 20:15:49,909 ERROR [SessionFactoryImpl] Error in named query: findAllArticles
> 
> org.hibernate.hql.ast.QuerySyntaxException: Articles is not mapped [SELECT a FROM Articles a]


Anscheinend ist JBoss der Meinung, dass Articles nicht gemappt ist.

Funzt dass den ausserhalb der JBoss?


----------



## Krusty (30. Nov 2009)

maki hat gesagt.:


> Funzt dass den ausserhalb der JBoss?




Leider auch nicht.


```
package storage;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class PersistenzBeispiel {

	public static void main(String[] args) {
		// erzeuge EntityManagerFactory mit Unit-Namen aus persistence.xml
		EntityManagerFactory emf = 
			Persistence.createEntityManagerFactory("BlogJPA");
		// erstelle einen Entity Manager
		EntityManager manager = emf.createEntityManager();
		// erzeuge Transaktion
		EntityTransaction tx = manager.getTransaction();
		
		tx.begin();
		manager.persist(new Article("title1", "text1"));
		tx.commit();
		
		tx.begin();
		// Abfrage ausfuehren
		List<Article> articles = 
			manager.createQuery(Article.findAllArticles).getResultList();
		// Transaktion beenden
		tx.commit();
		
		// Ergebnis der Abfrage in die Standardausgabe schreiben
		for (Article article : articles) {
			System.out.println(article.getId() + "\n"
					+ article.getTitle() + "\n"
					+ article.getText() + "\n");
		}
		
		manager.close();
	}
}
```

[XML]<?xml version="1.0" encoding="UTF-8"?>
<!-- Persistence Descriptor zur Konfiguration des Frameworks -->
<persistence version="1.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_1_0.xsd">

  <!-- Symbolischer Name der Persistenz-Unit und der zu verwendende
       Transaktionstyp; Standard ist 'JTA'  -->
  <persistence-unit name="BlogJPA" transaction-type="RESOURCE_LOCAL">

    <!-- Zu verwendende Service Provider Implementierung -->
    <provider>org.hibernate.ejb.HibernatePersistence</provider>

    <!-- Persistierbare Klassen dieser Persistenz-Unit -->
    <class>storage.Article</class>

    <!-- Konfiguration der Service Provider Implementierung -->
    <properties>

      <!-- Name des intern verwendeten JDBC-Treibers -->
      <property name="hibernate.connection.driver_class"
                value="org.apache.derby.jdbc.EmbeddedDriver"/>

      <!-- URL der zu verwendenden Datenbank -->
      <property name="hibernate.connection.url"
                value="jdbc:derby:${jboss.server.data.dir}${/}derby${/}blog;create=true"/>

      <!-- SQL-Dialect, den Hibernate verwenden soll -->
      <property name="hibernate.dialect"
                value="org.hibernate.dialect.DerbyDialect"/>

      <!-- Benutzername und Passwort -->
      <property name="hibernate.connection.username" value=""/>
      <property name="hibernate.connection.password" value=""/>

      <!-- Flag, ob SQL-Statements ausgegeben werden sollen -->
      <property name="hibernate.show_sql" value="true"/>
    </properties>
  </persistence-unit>
</persistence>
[/XML]


```
Exception in thread "main" javax.persistence.PersistenceException: [PersistenceUnit: BlogJPA] Unable to build EntityManagerFactory
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)
	at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
	at storage.PersistenzBeispiel.main(PersistenzBeispiel.java:15)
Caused by: org.hibernate.HibernateException: Errors in named queries: findAllArticles
	at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:397)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1327)
	at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:867)
	at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
	... 4 more
```


----------



## maki (30. Nov 2009)

Hmm.. den relevanten Code hast du hier leider nicht gepostet, nur im Archiv.

Hier auszüge aus der Entity:

```
@Entity

@Table(name="ARTICLES")

@NamedQuery(name=Article.findAllArticles, query="SELECT a FROM Articles a")

public class Article implements Serializable {

...
```
Du legst fest, dass die Tabelle "ARTICLES" heisst, aber die Entities sollten immer noch ARTICLE heissen, versuche mal deine NamedQuery so zu formulieren:

```
@NamedQuery(name=Article.findAllArticles, query="SELECT a FROM Article a")
```
So was tested man am übrigens besten mit Unittests


----------



## Krusty (30. Nov 2009)

maki hat gesagt.:


> Hmm.. den relevanten Code hast du hier leider nicht gepostet, nur im Archiv.





maki hat gesagt.:


> So was tested man am übrigens besten mit Unittests




Danke für die Hinweise.

Dein Änderungsvorschlag an meiner NamedQuery ergibt nun folgendes:


```
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not get or update next value
	at org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:614)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:226)
	at storage.PersistenzBeispiel.main(PersistenzBeispiel.java:22)
Caused by: org.hibernate.exception.SQLGrammarException: could not get or update next value
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.engine.TransactionHelper$1Work.doWork(TransactionHelper.java:64)
	at org.hibernate.engine.transaction.Isolater$JdbcDelegate.delegateWork(Isolater.java:211)
	at org.hibernate.engine.transaction.Isolater.doIsolatedWork(Isolater.java:67)
	at org.hibernate.engine.TransactionHelper.doWorkInNewTransaction(TransactionHelper.java:74)
	at org.hibernate.id.TableGenerator.generate(TableGenerator.java:118)
	at org.hibernate.id.TableHiLoGenerator.generate(TableHiLoGenerator.java:84)
	at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:122)
	at org.hibernate.ejb.event.EJB3PersistEventListener.saveWithGeneratedId(EJB3PersistEventListener.java:49)
	at org.hibernate.event.def.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:154)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:110)
	at org.hibernate.event.def.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:61)
	at org.hibernate.impl.SessionImpl.firePersist(SessionImpl.java:645)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:619)
	at org.hibernate.impl.SessionImpl.persist(SessionImpl.java:623)
	at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:220)
	... 1 more
Caused by: java.sql.SQLSyntaxErrorException: Table/View 'HIBERNATE_UNIQUE_KEY' does not exist.
	at org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedPreparedStatement40.<init>(Unknown Source)
	at org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
	at org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
	at org.hibernate.id.TableGenerator.doWorkInCurrentTransaction(TableGenerator.java:156)
	at org.hibernate.engine.TransactionHelper$1Work.doWork(TransactionHelper.java:61)
	... 15 more
Caused by: java.sql.SQLException: Table/View 'HIBERNATE_UNIQUE_KEY' does not exist.
	at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown Source)
	at org.apache.derby.impl.jdbc.SQLExceptionFactory40.wrapArgsForTransportAcrossDRDA(Unknown Source)
	... 30 more
Caused by: ERROR 42X05: Table/View 'HIBERNATE_UNIQUE_KEY' does not exist.
	at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
	at org.apache.derby.impl.sql.compile.FromBaseTable.bindTableDescriptor(Unknown Source)
	at org.apache.derby.impl.sql.compile.FromBaseTable.bindNonVTITables(Unknown Source)
	at org.apache.derby.impl.sql.compile.FromList.bindTables(Unknown Source)
	at org.apache.derby.impl.sql.compile.SelectNode.bindNonVTITables(Unknown Source)
	at org.apache.derby.impl.sql.compile.DMLStatementNode.bindTables(Unknown Source)
	at org.apache.derby.impl.sql.compile.DMLStatementNode.bind(Unknown Source)
	at org.apache.derby.impl.sql.compile.CursorNode.bindStatement(Unknown Source)
	at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
	at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
	at org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source)
	... 24 more
```


----------



## Krusty (6. Dez 2009)

Nachdem ich den Methodenaufruf "createQuery" durch "createNamedQuery" ersetzt hatte *und* von der benutzten Derby Datenbank zu MySQL wechselte, lies sich meine Testklasse erfolgreich ausführen.

Wenn ich nun die Enterprise Anwendung im JBoss starte, werden zwar keine Exceptions geworfen, aber der Aufruf von "http://127.0.0.1:8080/BlogWeb" im Browser führt zu dem Statuscode 404 mit der Beschreibung "The requested resource (/BlogWeb) is not available."

Der Inhalt meiner persistence.xml und meiner mysql-ds.xml sieht wie folgt aus:

persistence.xml

[XML]<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.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_1_0.xsd">
	<persistence-unit name="BlogJPA">
	    <jta-data-source>java:/MySqlDS</jta-data-source>
	    <properties>
	        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLInnoDBDialect" />
	        <property name="hibernate.hbm2dll.auto" value="create" />
	        <property name="hibernate.show_sql" value="true" />
	    </properties>
	</persistence-unit>
</persistence>[/XML]

mysql-ds.xml

[XML]<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>MySqlDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/blog</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password></password>
    <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
    <metadata>
       <type-mapping>mySQL</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>[/XML]

Ausschnitt aus meiner Servlet-Klasse:


```
@EJB
private ArticleManagerLocal articleManager;
```

Vor dieser Anwendung erstellte ich bereits eine Enterprise Anwendung ohne JPA-Projekt, in der ein Servlet eine EJB benutzte und das Ergebnis ohne Probleme im Browser anzeigte.


----------

