!!!java.sql.Blob and Clob support
The EJB 3.0 specification has support for Blob and Clob types.  The specification allows you to map the following types to
an entity property:
*{{java.sql.Blob}}
* {{java.sql.Clob}}
* any Serializable Object
* {{{byte[], Byte[]}}}
* {{{char[], String, Character[] }}}

To use this feature just need to use the {{@javax.persistence.Lob}} annotation.
The {{Lob}} annotation is an
encapsulation of what type of lob you want.  Below is an example of defining fields in an entity that are blobs or clobs.

{{{
@Entity
public class BlobEntity implements Serializable
{
   private long id;
   private Blob blobby;
   private Clob clobby;

   @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
   public long getId()
   {
      return id;
   }

   public void setId(long id)
   {
      this.id = id;
   }

   @Lob @Basic(fetch = FetchType.EAGER)
   public Blob getBlobby()
   {
      return blobby;
   }

   public void setBlobby(Blob blobby)
   {
      this.blobby = blobby;
   }

   @Lob @Basic(fetch = FetchType.EAGER)
   public Clob getClobby()
   {
      return clobby;
   }

   public void setClobby(Clob clobby)
   {
      this.clobby = clobby;
   }


}
}}}

!Working with Blobs and Clobs
Open up [LobTesterBean|src/org/jboss/tutorial/blob/bean/LobTesterBean.java] and look for the {{create()}} method.  JBoss EJB3
is built on top of the Hibernate persistence engine.  Hibernate has some helper methods for creating blobs and clobs that {{LobTesterBean}}
uses.

__Blob Creation__
|{{{org.hibernate.Hibernate.createBlob(byte[] bytes)}}}|
|{{{org.hibernate.Hibernate.createBlob(InputStream stream, int length)}}}|
|{{{org.hibernate.Hibernate.createBlob(InputStream stream)}}}|


__Clob Creation__
|{{{org.hibernate.Hibernate.createClob(String string)}}}|
|{{{org.hibernate.Hibernate.createClob(Reader reader, int length)}}}|

Blobs and clobs must only be accessed within a transaction.  Blobs and clobs are also not serializable or detachable.

!Mapping Strings/{{{byte[]}}} to Clob/Blob
This is pretty easy, just look at BlobEntity2.java

{{{
@Entity
public class BlobEntity2 implements Serializable
{
   private long id;
   private byte[] blobby;
   private String clobby;

   @Id @GeneratedValue(strategy=GenerationType.AUTO)
   public long getId()
   {
      return id;
   }

   public void setId(long id)
   {
      this.id = id;
   }

   @Lob @Basic(fetch = FetchType.EAGER)
   public byte[] getBlobby()
   {
      return blobby;
   }

   public void setBlobby(byte[] blobby)
   {
      this.blobby = blobby;
   }

   @Lob @Basic(fetch = FetchType.EAGER)
   public String getClobby()
   {
      return clobby;
   }

   public void setClobby(String clobby)
   {
      this.clobby = clobby;
   }


}
}}}

!Building and Running
To build and run the example, make sure you have {{ejb3.deployer}} installed in JBoss 4.0.x and have JBoss running.  See the reference manual on how to install EJB 3.0.
{{{
Unix:    $ export JBOSS_HOME=<where your jboss 4.0 distribution is>
Windows: $ set JBOSS_HOME=<where your jboss 4.0 distribution is>
$ ant
$ ant run

}}}

!View the tables and rows
You can view the tables created by JBoss by going to the [Hypersonic SQL service|http://localhost:8080/jmx-console/HtmlAdaptor?action=inspectMBean&name=jboss%3Aservice%3DHypersonic%2Cdatabase%3DlocalDB], scrolling down to the {{startDatabaseManager}} button and clicking it.  A Hypersonic SQL window will be minimized, but you can open it up to look at the tables and do queries.

