EJB - Blobs / Clobs
EJB 3.0 prend en charge les types Blob et Clob à l'aide de l'annotation @Lob. Les types Java suivants peuvent être mappés à l'aide de l'annotation @Lob.
- java.sql.Blob
- java.sql.Clob
- byte[]
- String
- Objet sérialisable
@Entity
@Table(name="books")
@EntityListeners(BookCallbackListener.class)
public class Book implements Serializable{
...
private byte[] image;
@Lob @Basic(fetch= FetchType.EAGER)
public byte[] getImage() {
return image;
}
...
}
Exemple d'application
Créons une application de test EJB pour tester la prise en charge des blob / clob dans EJB 3.0.
Étape | La description |
---|---|
1 | Créez un projet avec un nom EjbComponent sous un package com.tutorialspoint.entity comme expliqué dans le chapitre EJB - Créer une application . Veuillez utiliser le projet créé dans le chapitre EJB - Persistence en tant que tel pour ce chapitre pour comprendre les objets clob / blob dans les concepts ejb. |
2 | Créez Book.java sous le package com.tutorialspoint.entity . Utilisez EJB - Chapitre Persistence comme référence. Gardez le reste des fichiers inchangé. |
3 | Nettoyez et créez l'application pour vous assurer que la logique métier fonctionne conformément aux exigences. |
4 | Enfin, déployez l'application sous la forme d'un fichier jar sur JBoss Application Server. Le serveur d'applications JBoss démarrera automatiquement s'il n'est pas encore démarré. |
5 | Créez maintenant le client EJB, une application basée sur la console de la même manière que celle expliquée dans le chapitre EJB - Créer une application sous la rubriqueCreate Client to access EJB. |
Créer / modifier une table de livre
CREATE TABLE book (
id integer PRIMARY KEY,
name varchar(50)
);
Alter table book add image bytea;
Alter table book add xml text;
EJBComponent (module EJB)
Book.java
package com.tutorialspoint.entity;
import com.tutorialspoint.callback.BookCallbackListener;
import java.io.Serializable;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Lob;
import javax.persistence.Table;
@Entity
@Table(name="book")
public class Book implements Serializable{
private int id;
private String name;
private byte[] image;
private String xml;
public Book() {
}
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name="id")
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Lob @Basic(fetch= FetchType.EAGER)
public byte[] getImage() {
return image;
}
public void setImage(byte[] image) {
this.image = image;
}
@Lob @Basic(fetch= FetchType.EAGER)
public String getXml() {
return xml;
}
public void setXml(String xml) {
this.xml = xml;
}
}
LibraryPersistentBeanRemote.java
package com.tutorialspoint.stateless;
import com.tutorialspoint.entity.Book;
import java.util.List;
import javax.ejb.Remote;
@Remote
public interface LibraryPersistentBeanRemote {
void addBook(Book bookName);
List<Book> getBooks();
}
LibraryPersistentBean.java
package com.tutorialspoint.stateless;
import com.tutorialspoint.entity.Book;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
public LibraryPersistentBean() {
}
@PersistenceContext(unitName="EjbComponentPU")
private EntityManager entityManager;
public void addBook(Book book) {
entityManager.persist(book);
}
public List<Book> getBooks() {
return entityManager.createQuery("From Book").getResultList();
}
}
Dès que vous déployez le projet EjbComponent sur JBOSS, notez le journal jboss.
JBoss a créé automatiquement une entrée JNDI pour notre bean session - LibraryPersistentBean/remote.
Nous utiliserons cette chaîne de recherche pour obtenir un objet métier distant de type - com.tutorialspoint.interceptor.LibraryPersistentBeanRemote
Sortie du journal du serveur d'applications JBoss
...
16:30:01,401 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
LibraryPersistentBean/remote - EJB3.x Default Remote Business Interface
LibraryPersistentBean/remote-com.tutorialspoint.interceptor.LibraryPersistentBeanRemote - EJB3.x Remote Business Interface
16:30:02,723 INFO [SessionSpecContainer] Starting jboss.j2ee:jar=EjbComponent.jar,name=LibraryPersistentBean,service=EJB3
16:30:02,723 INFO [EJBContainer] STARTED EJB: com.tutorialspoint.interceptor.LibraryPersistentBeanRemote ejbName: LibraryPersistentBean
16:30:02,731 INFO [JndiSessionRegistrarBase] Binding the following Entries in Global JNDI:
LibraryPersistentBean/remote - EJB3.x Default Remote Business Interface
LibraryPersistentBean/remote-com.tutorialspoint.interceptor.LibraryPersistentBeanRemote - EJB3.x Remote Business Interface
...
EJBTester (client EJB)
jndi.properties
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=localhost
Ces propriétés sont utilisées pour initialiser l'objet InitialContext du service de nommage java.
L'objet InitialContext sera utilisé pour rechercher un bean session sans état.
EJBTester.java
package com.tutorialspoint.test;
import com.tutorialspoint.stateful.LibraryBeanRemote;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class EJBTester {
BufferedReader brConsoleReader = null;
Properties props;
InitialContext ctx;
{
props = new Properties();
try {
props.load(new FileInputStream("jndi.properties"));
} catch (IOException ex) {
ex.printStackTrace();
}
try {
ctx = new InitialContext(props);
} catch (NamingException ex) {
ex.printStackTrace();
}
brConsoleReader =
new BufferedReader(new InputStreamReader(System.in));
}
public static void main(String[] args) {
EJBTester ejbTester = new EJBTester();
ejbTester.testBlobClob();
}
private void showGUI() {
System.out.println("**********************");
System.out.println("Welcome to Book Store");
System.out.println("**********************");
System.out.print("Options \n1. Add Book\n2. Exit \nEnter Choice: ");
}
private void testBlobClob() {
try {
int choice = 1;
LibraryPersistentBeanRemote libraryBean =
(LibraryPersistentBeanRemote)
ctx.lookup("LibraryPersistentBean/remote");
while (choice != 2) {
String bookName;
String publisherName;
String publisherAddress;
showGUI();
String strChoice = brConsoleReader.readLine();
choice = Integer.parseInt(strChoice);
if (choice == 1) {
System.out.print("Enter book name: ");
bookName = brConsoleReader.readLine();
String xml = "<book><name>"+bookName+"</name></book>";
Book book = new Book();
book.setName(bookName);
byte[] imageBytes = {0x32, 0x32,0x32, 0x32,0x32,
0x32,0x32, 0x32,
0x32, 0x32,0x32, 0x32,0x32, 0x32,0x32, 0x32,
0x32, 0x32,0x32, 0x32,0x32, 0x32,0x32, 0x32
};
book.setImage(imageBytes);
book.setXml(xml);
libraryBean.addBook(book);
} else if (choice == 2) {
break;
}
}
List<Book> booksList = libraryBean.getBooks();
System.out.println("Book(s) entered so far: " + booksList.size());
int i = 0;
for (Book book:booksList) {
System.out.println((i+1)+". " + book.getName());
byte[] imageByts = book.getImage();
if(imageByts != null) {
System.out.print("image bytes: [");
for(int j = 0; j < imageByts.length ; j++) {
System.out.print("0x"
+ String.format("%x", imageByts[j]) +" ");
}
System.out.println("]");
}
System.out.println(book.getXml());
i++;
}
} catch (Exception e) {
System.out.println(e.getMessage());
e.printStackTrace();
}finally {
try {
if(brConsoleReader !=null) {
brConsoleReader.close();
}
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
}
EJBTester effectue les tâches suivantes.
Chargez les propriétés de jndi.properties et initialisez l'objet InitialContext.
Dans la méthode testInterceptedEjb (), la recherche jndi est effectuée avec le nom - "LibraryPersistenceBean / remote" pour obtenir l'objet métier distant (EJB sans état).
Ensuite, l'utilisateur voit une interface utilisateur de magasin de bibliothèque et il / elle est invité à entrer un choix.
Si l'utilisateur entre 1, le système demande le nom du livre et enregistre le livre à l'aide de la méthode addBook () du bean session sans état. Session Bean stocke le livre dans la base de données.
Si l'utilisateur entre 2, le système récupère les livres à l'aide de la méthode getBooks () du bean session sans état et se ferme.
Exécuter le client pour accéder à EJB
Recherchez EJBTester.java dans l'explorateur de projet. Faites un clic droit sur la classe EJBTester et sélectionnezrun file.
Vérifiez la sortie suivante dans la console Netbeans.
run:
**********************
Welcome to Book Store
**********************
Options
1. Add Book
2. Exit
Enter Choice: 1
Enter book name: learn testing
**********************
Welcome to Book Store
**********************
Options
1. Add Book
2. Exit
Enter Choice: 2
Book(s) entered so far: 1
1. learn testing
image bytes: [
0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 0x32 ]
<book><name>learn testing</name></book>
BUILD SUCCESSFUL (total time: 20 seconds)