雷林鹏分享: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)

  (编辑:雷林鹏 来源:网络|侵删)

posted @ 2020-06-12 14:38  雷林鹏  阅读(177)  评论(0编辑  收藏  举报