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 TABLE book ( id integer PRIMARY KEY, name varchar(50) ); Alter table book add image bytea; Alter table book add xml text;
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; } }
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(); }
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(); } }
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
... 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 ...
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
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 1. Add Book 2. Exit Enter 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 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.
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 ] <book><name>learn testing</name></book> BUILD SUCCESSFUL (total time: 20 seconds)