雷林鵬分享:EJB Blobs/Clobs

  EJB3.0提供支持BLOB和CLOB類型,使用@Lob註解。下面的Java類型可以映射使用@Lob註解。

  java.sql.Blob

  java.sql.Clob

  byte[]

  String

  Serializable Object

  @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;

  }

  ...

  }

  示例應用程序

  讓我們創建一個測試EJB在EJB3.0應用程序來測試BLOB / CLOB支持。

  Step描述

  1創建一個項目與一個名字EjbComponent包com.youcompany.entity下EJB中的解釋 - 創建應用程序的章節。請作爲的項目中創建EJB -閱讀 持久性本章可瞭解CLOB/ BLOB對象EJB概念。

  2創建Book.java包com.youcompany.entity下。使用EJB - 持久性章作爲參考。其餘文件保持不變。

  3清理並生成應用程序以確保業務邏輯是按要求工作。

  4最後,將應用程序部署在JBoss應用服務器上的jar文件的形式。 JBoss應用服務器將自動開始瀏覽網頁,如果它尚未啓動。

  5現在創建EJB客戶端,基於控制檯的應用程序以同樣的方式在EJB解釋 - 下創建應用程序本章主題 Create Client to access EJB.

  Create/Alter book table

  CREATE TABLE book (

  id integer PRIMARY KEY,

  name varchar(50)

  );

  Alter table book add image bytea;

  Alter table book add xml text;

  EJBComponent (EJB Module)

  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 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 getBooks() {

  return entityManager.createQuery("From Book").getResultList();

  }

  }

  As soon as you deploy the EjbComponent project on JBOSS, notice the jboss log.

  JBoss has automatically created a JNDI entry for our session bean -LibraryPersistentBean/remote.

  We'll using this lookup string to get remote business object of type -com.tutorialspoint.interceptor.LibraryPersistentBeanRemote

  JBoss Application server log output

  ...

  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 (EJB Client)

  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

  These properties are used to initialize the InitialContext object of java naming service

  InitialContext object will be used to lookup stateless session bean

  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 = ""+bookName+"";

  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 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 is doing the following tasks.

  Load properties from jndi.properties and initialize the InitialContext object.

  In testInterceptedEjb() method, jndi lookup is done with name - "LibraryPersistenceBean/remote" to obtain the remote business object (stateless ejb).

  Then user is shown a library store User Interface and he/she is asked to enter choice.

  If user enters 1, system asks for book name and saves the book using stateless session bean addBook() method. Session Bean is storing the book in database.

  If user enters 2, system retrieves books using stateless session bean getBooks() method and exits.

  Run Client to access EJB

  Locate EJBTester.java in project explorer. Right click on EJBTester class and select run file.

  Verify the following output in Netbeans console.

  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 ]

  learn testing

  BUILD SUCCESSFUL (total time: 20 seconds)

  (編輯:雷林鵬 來源:網絡|侵刪)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章