Dúvida E.J.B. - Help

Pessoal,

Estou lendo o livro EJB 3.0 da O’Rielly e não estou conseguindo completar o exercício do capítulo 4.
Gostaria muito de contar com a ajuda de vcs, até mesmo de quem já estudou este livro.

No momento em que inicializo o servidor JBoss 5.0 ele acusa o seguinte:

*** CONTEXTS MISSING DEPENDENCIES: Name -> Dependency{Required State:Actual State}

jboss.j2ee:jar=Cap4.jar,name=TravelAgentBean,service=EJB3
 -> <UNKNOWN>{Described:** UNRESOLVED Demands 'persistence.units:unitName=titan **}

E quando executo o exemplo ele não realiza a tarefa do exercício que é persistir os registros na tabela Cabin e imprimir os registros depois.

Abaixo segue a estrutura do meu projeto e as respectivas classes, e arquivos de configuração.
Gostaria muito da ajuda de vcs e agradeço antecipadamente.

Interface Remota - TravelAgentRemote

package dev.com.titan.travelagent;

import javax.ejb.Remote;

import dev.com.titan.domain.Cabin;

@Remote
public interface TravelAgentRemote{
    public void createCabin(Cabin cabin);
    public Cabin findCabin(int pKey);
}

Classe Bean - TravelAgentBean

package dev.com.titan.travelagent;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import dev.com.titan.domain.Cabin; 

@Stateless
public class TravelAgentBean implements TravelAgentRemote{
    @PersistenceContext(unitName="titan") private EntityManager manager;
    
    public void createCabin(Cabin cabin){
	manager.persist(cabin);
    }

    public Cabin findCabin(int pKey){
	return manager.find(Cabin.class, pKey);
    }
}

Entidade - Cabin

package dev.com.titan.domain;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Id;

@Entity
@Table(name="CABIN")
public class Cabin implements java.io.Serializable 
{
    private int id;
    private String name;
    private int deckLevel;
    private int shipId;
    private int bedCount;

    @Id
    @Column(name="ID")
    public int getId()
    {
	return id;
    }
    public void setId(int pk) 
    {
	id = pk;
    }

    @Column(name="NAME")
    public String getName()
    {
        return name;
    }
    public void setName(String str)
    {
	name = str;
    }

    @Column(name="DECK_LEVEL")
    public int getDeckLevel() 
    {
	return deckLevel;
    }
    public void setDeckLevel(int level)
    {
	deckLevel = level;
    }

    @Column(name="SHIP_ID")
    public int getShipId()
    {
	return shipId;
    }
    public void setShipId(int sid)
    {
	shipId = sid;
    }

    @Column(name="BED_COUNT")
    public int getBedCount() 
    { 
	return bedCount; 
    }
    public void setBedCount(int bed) 
    { 
	bedCount = bed; 
    }
}

Classe Cliente - Client

package dev.com.titan.clients;

import dev.com.titan.travelagent.TravelAgentRemote;
import dev.com.titan.domain.Cabin;

import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;

import javax.rmi.PortableRemoteObject;

public class Client{
    public static void main(String [] args){
        try{
            Context jndiContext = getInitialContext();
            Object ref = jndiContext.lookup("TravelAgentBean/remote");
            TravelAgentRemote dao = (TravelAgentRemote)ref;

            Cabin cabin_1 = new Cabin();
            cabin_1.setId(1);
            cabin_1.setName("Master Suite");
            cabin_1.setDeckLevel(1);
            cabin_1.setShipId(1);
            cabin_1.setBedCount(3);

            dao.createCabin(cabin_1);

            Cabin cabin_2 = dao.findCabin(1);
            System.out.println(cabin_2.getName());
            System.out.println(cabin_2.getDeckLevel());
            System.out.println(cabin_2.getShipId());
            System.out.println(cabin_2.getBedCount());

        } 
        catch (javax.naming.NamingException ne){
	    ne.printStackTrace();
	}
    }

    public static Context getInitialContext() throws javax.naming.NamingException{
        return new javax.naming.InitialContext();
    }
}

persistence.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="titan" transaction-type="JTA">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
       <jta-data-source>java:/TitanDS</jta-data-source>
       <properties>
          <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
          <property name="hibernate.hbm2ddl.auto" value="update"/>
       </properties>
    </persistence-unit>
</persistence>

titandb-ds.xml

<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name>TitanDS</jndi-name>
    <connection-url>jdbc:mysql://localhost:3306/titandb</connection-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <user-name>root</user-name>
    <password>igor</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>