Hibernate 3 + EJB 3 + JBoss 5

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
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:

Code:
<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

Code:
<?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:

Code:
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
 
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:😱
 
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.
 
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:

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

*auf Geistesblitz wartet* 😉
 
Und schon wieder das Problem selbst gelöst. Diesmal hat aber Google geholfen 😉 .

Das hier

Code:
		<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.
 
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' **
 
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).
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben