EJB - Blobs / Clobs
EJB 3.0 cung cấp hỗ trợ cho các loại Blob và Clob bằng cách sử dụng chú thích @Lob. Các loại java sau có thể được ánh xạ bằng cách sử dụng chú thích @Lob.
- java.sql.Blob
- java.sql.Clob
- byte[]
- String
- Đối tượng có thể nối tiếp hóa
@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;
}
...
}
Ứng dụng mẫu
Hãy để chúng tôi tạo một ứng dụng EJB thử nghiệm để kiểm tra hỗ trợ blob / clob trong EJB 3.0.
Bươc | Sự miêu tả |
---|---|
1 | Tạo một dự án với tên EjbComponent trong một gói com.tutorialspoint.entity như được giải thích trong chương EJB - Tạo ứng dụng . Vui lòng sử dụng dự án được tạo trong chương EJB - Persistence như vậy cho chương này để hiểu các đối tượng clob / blob trong khái niệm ejb. |
2 | Tạo Book.java trong gói com.tutorialspoint.entity . Sử dụng chương EJB - Persistence làm tài liệu tham khảo. Giữ phần còn lại của các tệp không thay đổi. |
3 | Làm sạch và xây dựng ứng dụng để đảm bảo logic nghiệp vụ đang hoạt động theo yêu cầu. |
4 | Cuối cùng, triển khai ứng dụng dưới dạng tệp jar trên Máy chủ ứng dụng JBoss. Máy chủ ứng dụng JBoss sẽ tự động khởi động nếu nó chưa được khởi động. |
5 | Bây giờ hãy tạo ứng dụng khách EJB, một ứng dụng dựa trên bảng điều khiển theo cách tương tự như được giải thích trong chương EJB - Tạo ứng dụng theo chủ đềCreate Client to access EJB. |
Tạo / thay đổi bảng sách
CREATE TABLE book (
id integer PRIMARY KEY,
name varchar(50)
);
Alter table book add image bytea;
Alter table book add xml text;
EJBComponent (Mô-đun 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;
}
}
LibraryPersistsBeanRemote.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();
}
LibraryPersistsBean.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();
}
}
Ngay sau khi bạn triển khai dự án EjbComponent trên JBOSS, hãy để ý nhật ký jboss.
JBoss đã tự động tạo một mục nhập JNDI cho bean phiên của chúng tôi - LibraryPersistentBean/remote.
Chúng tôi sẽ sử dụng chuỗi tra cứu này để lấy đối tượng nghiệp vụ từ xa thuộc loại - com.tutorialspoint.interceptor.LibraryPersistentBeanRemote
Đầu ra nhật ký máy chủ ứng dụng 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 (Khách hàng 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
Các thuộc tính này được sử dụng để khởi tạo đối tượng InitialContext của dịch vụ đặt tên java.
Đối tượng InitialContext sẽ được sử dụng để tra cứu bean phiên không trạng thái.
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 thực hiện các nhiệm vụ sau.
Tải các thuộc tính từ jndi.properties và khởi tạo đối tượng InitialContext.
Trong phương thức testInterceptedEjb (), việc tra cứu jndi được thực hiện với tên - "LibraryPersistenceBean / remote" để lấy đối tượng nghiệp vụ từ xa (EJB không trạng thái).
Sau đó, người dùng được hiển thị Giao diện Người dùng trong kho thư viện và họ được yêu cầu nhập một lựa chọn.
Nếu người dùng nhập 1, hệ thống sẽ hỏi tên sách và lưu sách bằng phương thức addBook () phiên đậu không trạng thái. Phiên Bean đang lưu trữ sách trong cơ sở dữ liệu.
Nếu người dùng nhập 2, hệ thống sẽ truy xuất sách bằng phương thức getBooks () của phiên đậu không trạng thái và thoát.
Chạy ứng dụng khách để truy cập EJB
Định vị EJBTester.java trong trình khám phá dự án. Nhấp chuột phải vào lớp EJBTester và chọnrun file.
Xác minh kết quả sau trong bảng điều khiển 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)