雷林鹏分享:EJB嵌入对象

  EJB 3.0中提供了选项嵌入到实体bean的Java POJO(普通Java对象)和嵌入式POJO类的方法允许列名映射。嵌入一个java的POJO必须定义了@ Embeddable注解。

  @Embeddable

  public class Publisher implements Serializable{

  private String name;

  private String address;

  ...

  }

  上面的类可以使用@ Embedded批注嵌入

  @Entity

  public class Book implements Serializable{

  private int id;

  private String name;

  private Publisher publisher;

  ...

  @Embedded

  @AttributeOverrides({

  @AttributeOverride(name = "name",

  column = @Column(name = "PUBLISHER")),

  @AttributeOverride(name = "address",

  column = @Column(name = "PUBLISHER_ADDRESS"))

  })

  public Publisher getPublisher() {

  return publisher;

  }

  ...

  }

  示例应用程序

  让我们创建一个测试EJB应用程序来测试EJB 3.0中的嵌入对象。

  步骤描述

  1创建一个项目的名称EjbComponent下一个包com.tutorialspoint.entity中所解释的EJB -创建应用程序一章。请使用创建的项目EJB -持久性章节因此本章来了解EJB概念嵌入的对象。

  2创建Publisher.java 包下com.tutorialspoint.entity作为解释的EJB -创建应用程序一章。保持不变的文件其余部分。

  3创建Book.java 包下com.tutorialspoint.entity。使用EJB -持久性章节作为参考。保持不变的文件其余部分。

  4清理并生成应用程序,以确保业务逻辑正在按要求。

  5最后,部署在JBoss应用服务器jar文件的形式应用。如果尚未启动JBoss应用服务器会得到自动启动。

  6现在创建EJB客户端,以同样的方式一个基于控制台的应用程序在解释EJB -创建应用程序一章的主题创建客户端访问EJB。

  Create/Alter book table

  CREATE TABLE book (

  id integer PRIMARY KEY,

  name varchar(50)

  );

  Alter table book add publisher varchar(100);

  Alter table book add publisher_address varchar(200);

  EJBComponent (EJB Module)

  Publisher.java

  package com.tutorialspoint.entity;

  import java.io.Serializable;

  import javax.persistence.Embeddable;

  @Embeddable

  public class Publisher implements Serializable{

  private String name;

  private String address;

  public Publisher(){}

  public Publisher(String name, String address){

  this.name = name;

  this.address = address;

  }

  public String getName() {

  return name;

  }

  public void setName(String name) {

  this.name = name;

  }

  public String getAddress() {

  return address;

  }

  public void setAddress(String address) {

  this.address = address;

  }

  public String toString(){

  return name + "," + address;

  }

  }

  Book.java

  package com.tutorialspoint.entity;

  import com.tutorialspoint.callback.BookCallbackListener;

  import java.io.Serializable;

  import javax.persistence.AttributeOverride;

  import javax.persistence.AttributeOverrides;

  import javax.persistence.Column;

  import javax.persistence.Embedded;

  import javax.persistence.Entity;

  import javax.persistence.EntityListeners;

  import javax.persistence.GeneratedValue;

  import javax.persistence.GenerationType;

  import javax.persistence.Id;

  import javax.persistence.Table;

  @Entity

  @Table(name="book")

  public class Book implements Serializable{

  private int id;

  private String name;

  private Publisher publisher;

  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;

  }

  @Embedded

  @AttributeOverrides({

  @AttributeOverride(name = "name",

  column = @Column(name = "PUBLISHER")),

  @AttributeOverride(name = "address",

  column = @Column(name = "PUBLISHER_ADDRESS"))

  })

  public Publisher getPublisher() {

  return publisher;

  }

  public void setPublisher(Publisher publisher) {

  this.publisher = publisher;

  }

  }

  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();

  }

  }

  一旦你部署EjbComponent项目在Jboss应用服务器 ,发现jboss的日志。

  JBoss已经自动为我们的会话bean创建一个JNDI入口 - LibraryPersistentBean/remote.

  我们将使用这个查询字符串来获得远程类型的业务对象 -com.tutorialspoint.interceptor.LibraryPersistentBeanRemote

  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 (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

  这些属性是用来初始化InitialContext对象的Java命名服务

  InitialContext的对象将被用于查找无状态会话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.testEmbeddedObjects();

  }

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

  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();

  System.out.print("Enter publisher name: ");

  publisherName = brConsoleReader.readLine();

  System.out.print("Enter publisher address: ");

  publisherAddress = brConsoleReader.readLine();

  Book book = new Book();

  book.setName(bookName);

  book.setPublisher

  (new Publisher(publisherName,publisherAddress));

  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());

  System.out.println("Publication: "+book.getPublisher());

  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做以下任务。

  jndi.properties中加载和初始化的InitialContext对象。

  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 retrives books using stateless session bean getBooks() method and exits.

  运行客户端访问EJB

  在项目资源管理器中找到EJBTester.java。右键点击上EJBTester类,并选择 run file.

  在Netbeans控制台验证以下输出。

  run:

  **********************

  Welcome to Book Store

  **********************

  Options

  1. Add Book

  2. Exit

  Enter Choice: 1

  Enter book name: learn html5

  Enter publisher name: SAMS

  Enter publisher address: DELHI

  **********************

  Welcome to Book Store

  **********************

  Options

  1. Add Book

  2. Exit

  Enter Choice: 2

  Book(s) entered so far: 1

  1. learn html5

  Publication: SAMS,DELHI

  BUILD SUCCESSFUL (total time: 21 seconds)

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

posted @ 2020-06-11 15:09  雷林鹏  阅读(142)  评论(0编辑  收藏  举报