# Hibernate 3 + EJB 3 + JBoss 5



## The_S (2. Apr 2009)

Hallo zusammen,

wir haben eine Hibernate-Anwendung mit Anbindung an unsere DB2. Die Hibernate-Anwendung läuft momentan noch lokal und wird bspw. über JUnit-Tests bzw. WebServices mit Java 6 getestet bzw. angesprochen.

Aufgabe ist es jetzt, diese Hibernate-Anwendung als EJB im JBoss zu deployen. Da ich noch keine Erfahrung mit JBoss habe, stellt sich das Ganze jetzt für mich ein wenig als Problem dar (ich habe es bis jetzt nur geschafft, eine Non-Hibernate EJB ohne DB-Anbindung zu deployen). Deshalb wollte ich erst einmal ein einfaches EJB-Projekt + zugehöriges EAR-Projekt anlegen, welches ich zusätzlich um die DB-Anbindung und persistence.xml ergänze. Hierzu habe ich mir im *EJB-Projekt* _jboss.project.ejb_ eine einfache SessionBean mit Remote-Interface angelegt. Das funktioniert auch soweit und lässt sich mit dem EAR-File auch ganz gewöhnlich ohne Fehler deployen. 

Als nächsten Schritt möchte ich eine *persistence.xml* für Hibernate im Meta-Inf Verzeichnis der EJB anlegen. Für die DB-Verbindung als Data-Source habe ich die Datei *db2-ds.xml* unter _jbosshome_/server/default/deploy mit folgendem Inhalt angelegt:


```
<datasources>
  <local-tx-datasource>
    <jndi-name>db2-ds</jndi-name>
    <connection-url>jdbc:db2://12.12.12.12:11111/DB</connection-url>
    <driver-class>com.ibm.db2.jcc.DB2Driver</driver-class>
    <user-name>MeinUser</user-name>
    <password>MeinPasswort</password>
    <min-pool-size>0</min-pool-size>
    <metadata>
       <type-mapping>DB2</type-mapping>
    </metadata>
  </local-tx-datasource>
</datasources>
```

Und Versuche auf diese mit der persistence.xml


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

	<persistence-unit name="persunit" transaction-type="JTA">
	
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<jta-data-source>java:/jdb2-ds</jta-data-source>

		<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect"	/>
		</properties>

	</persistence-unit>
</persistence>
```

zuzugreifen. Deploye ich jetzt dieses auf dem Server (sonst habe ich noch nichts verändert), erhalte ich beim Serverstart folgende Fehlermeldung:


```
14:32:31,199 ERROR [ProfileServiceBootstrap] Failed to load profile: Summary of incomplete deployments (SEE PREVIOUS ERRORS FOR DETAILS):

DEPLOYMENTS MISSING DEPENDENCIES:
  Deployment "persistence.unit:unitName=jboss.project.ear.ear/jboss.project.ejb.jar#persunit" is missing the following dependencies:
    Dependency "jboss.jca:name=java/jdb2-ds,service=DataSourceBinding" (should be in state "Create", but is actually in state "** NOT FOUND Depends on 'jboss.jca:name=java/jdb2-ds,service=DataSourceBinding' **")

DEPLOYMENTS IN ERROR:
  Deployment "jboss.jca:name=java/jdb2-ds,service=DataSourceBinding" is in error due to the following reason(s): ** NOT FOUND Depends on 'jboss.jca:name=java/jdb2-ds,service=DataSourceBinding' **
```

Über Hilfe (kommen bestimmt noch mehr Fragen  ) würde ich mich freuen.

Grüße


----------



## The_S (2. Apr 2009)

Arg ... heut ist wohl der Tag der blöden Fehler. In der jta-data-source der persistence.xml hat sich ein j zuviel eingeschlichen  .

Faszinierend, wie ich immer 2 Sekunden nach dem Posten selbst eine Lösung auf mein Problem finde :lol:


----------



## maki (2. Apr 2009)

Gar nicht so selten.

Habe ich bei mir und anderen auch schon erlebt:
Wenn man sein Problem beschreiben muss, kommt man oft selbst auf die Lösung.


----------



## The_S (2. Apr 2009)

Das stimmt wohl. Deshalb noch mal ein Versuch (scheint besser zu klappen, als Stundenlang zu Googeln  ):

Nachdem die jta-data-source jetzt stimmt, habe ich das eigentliche Hibernate-Projekt mit eingebunden und die nun angepasste persistence.xml wieder in das Hibernate-Projekt verschoben (natürlich inkl. Entitys). Das *EJB-Projekt* erhält eine Referenz über den Build-Path auf das Hibernate-Projekt. Den entityManager erzeuge ich so:

[HIGHLIGHT="Java"]	@PersistenceContext(unitName="persunit")
	private EntityManager entityManager;[/HIGHLIGHT]

Außerdem ist das Hibernate-Projekt im EAR-Projekt als Java EE Module Dependency eingetragen (JAR/Module und Lib Dir). Deployen geht noch ohne Probleme und Fehlermeldung, rufe ich jetzt aber eine Methode mit DB-Zugriff über meinen Client auf, erhalte ich folgende (um unwichtiges gekürzte) Fehlermeldung:


```
Caused by: org.hibernate.HibernateException: The chosen transaction strategy requires access to the JTA TransactionManager
```

*auf Geistesblitz wartet*


----------



## The_S (2. Apr 2009)

Und schon wieder das Problem selbst gelöst. Diesmal hat aber Google geholfen  .

Das hier


```
<properties>
			<property name="hibernate.dialect" value="org.hibernate.dialect.DB2Dialect"	/>
			<property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory" />
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
			
		</properties>
```

Muss noch in die persistence.xml.

Danke fürs lesen.


----------



## slay24 (14. Apr 2009)

DEPLOYMENTS MISSING DEPENDENCIES:
  Deployment "jboss.j2ee:ear=Projekt_EAR.ear,jar=Modul_EJB.jar,name=StatelessSessionBean,service=EJB3" is missing the following dependencies:
    Dependency "<UNKNOWN jboss.j2ee:ear=Projekt_EAR.ear,jar=Modul_EJB.jar,name=StatelessSessionBean,service=EJB3>" (should be in state "Described", but is actually in state "** UNRESOLVED Demands 'persistence.unit:unitName=Projekt_EAR.ear/Modul_EJB.jar#TestPersistence' **")

DEPLOYMENTS IN ERROR:
  Deployment "persistence.unit:unitName=Projekt_EAR.ear/Modul_EJB.jar#TestPersistence" is in error due to the following reason(s): org.hibernate.HibernateException: Hibernate Dialect must be explicitly set
  Deployment "<UNKNOWN jboss.j2ee:ear=Projekt_EAR.ear,jar=Modul_EJB.jar,name=StatelessSessionBean,service=EJB3>" is in error due to the following reason(s): ** UNRESOLVED Demands 'persistence.unit:unitName=Projekt_EAR.ear/Modul_EJB.jar#TestPersistence' **


----------



## happy_robot (16. Apr 2009)

erweitere den properties part mal um:


    <property name="hibernate.hbm2ddl.auto" value="update" />


der entitymanager weiss nicht was er mid der DS anfangen soll.....soll er sie anlegen (create) oder anpassen (update).


----------

