雷林鵬分享:EJB實體關係

  EJB 3.0中提供的選項來定義像一對一的數據庫實體關係/映射,一對多,多對一和多對多關係。以下是相關的註釋。

  OneToOne - 對象都具有一對一的關係。例如,乘客可以在時間旅行使用一張票。

  OneToMany - 對象是具有一對多的關係。例如,一個父親可以有多個孩子。

  ManyToOne - 對象有多對一的關係。舉例來說,多個孩子對一個母親。

  ManyToMany - 對象是多對多的關係。舉例來說,一本書可以多發作者,一個作者可以寫多本書。

  在這裏,我們將演示如何使用多對多的映射。要代表多對多的關係,三表是必需的。

  Book - 書籍記錄表

  Author - 作者Author表記錄

  Book_Author - BOOK_AUTHOR上述Book和Author表的表具有關聯。

  創建表

  創建表book author, book_author 在默認數據庫 postgres.

  CREATE TABLE book (

  book_id integer,

  name varchar(50)

  );

  CREATE TABLE author (

  author_id integer,

  name varchar(50)

  );

  CREATE TABLE book_author (

  book_id integer,

  author_id integer

  );

  創建實體類

  @Entity

  @Table(name="author")

  public class Author implements Serializable{

  private int id;

  private String name;

  ...

  }

  @Entity

  @Table(name="book")

  public class Book implements Serializable{

  private int id;

  private String title;

  private Set authors;

  ...

  }

  Use ManyToMany annotation in Book Entity

  @Entity

  public class Book implements Serializable{

  ...

  @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}

  , fetch = FetchType.EAGER)

  @JoinTable(table = @Table(name = "book_author"),

  joinColumns = {@JoinColumn(name = "book_id")},

  inverseJoinColumns = {@JoinColumn(name = "author_id")})

  public Set getAuthors()

  {

  return authors;

  }

  ...

  }

  實例應用

  讓我們創建一個測試EJB應用程序來測試EJB3.0實體關係對象。

  Step描述

  1Create a project with a name EjbComponent under a package com.tutorialspoint.entity as explained in the EJB - Create Application chapter. Please use the project created in EJB - Persistence chapter as such for this chapter to understand embedded objects in ejb concepts.

  2Create Author.java under package com.tutorialspoint.entity as explained in the EJB - Create Application chapter. Keep rest of the files unchanged.

  3Create Book.java under package com.tutorialspoint.entity. Use EJB - Persistence chapter as reference. Keep rest of the files unchanged.

  4Clean and Build the application to make sure business logic is working as per the requirements.

  5Finally, deploy the application in the form of jar file on JBoss Application Server. JBoss Application server will get started automatically if it is not started yet.

  6Now create the ejb client, a console based application in the same way as explained in theEJB - Create Application chapter under topic Create Client to access EJB.

  EJBComponent (EJB Module)

  Author.java

  package com.tutorialspoint.entity;

  import java.io.Serializable;

  import javax.persistence.Column;

  import javax.persistence.Entity;

  import javax.persistence.GeneratedValue;

  import javax.persistence.GenerationType;

  import javax.persistence.Id;

  import javax.persistence.Table;

  @Entity

  @Table(name="author")

  public class Author implements Serializable{

  private int id;

  private String name;

  public Author(){}

  public Author(int id, String name){

  this.id = id;

  this.name = name;

  }

  @Id

  @GeneratedValue(strategy= GenerationType.IDENTITY)

  @Column(name="author_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;

  }

  public String toString(){

  return id + "," + name;

  }

  }

  Book.java

  package com.tutorialspoint.entity;

  import java.io.Serializable;

  import javax.persistence.Column;

  import javax.persistence.Entity;

  import javax.persistence.Table;

  import javax.persistence.GeneratedValue;

  import javax.persistence.GenerationType;

  @Entity

  @Table(name="book")

  public class Book implements Serializable{

  private int id;

  private String name;

  private Set authors;

  public Book(){

  }

  @Id

  @GeneratedValue(strategy= GenerationType.IDENTITY)

  @Column(name="book_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;

  }

  public void setAuthors(Set authors) {

  this.authors = authors;

  }

  @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}

  , fetch = FetchType.EAGER)

  @JoinTable(table = @Table(name = "book_author"),

  joinColumns = {@JoinColumn(name = "book_id")},

  inverseJoinColumns = {@JoinColumn(name = "author_id")})

  public Set getAuthors()

  {

  return authors;

  }

  }

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

  }

  }

  只要你在JBoss部署 EjbComponent項目,會注意到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

  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.*;

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

  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 author name: ");

  authorName = brConsoleReader.readLine();

  Book book = new Book();

  book.setName(bookName);

  Author author = new Author();

  author.setName(authorName);

  Set authors = new HashSet();

  authors.add(author);

  book.setAuthors(authors);

  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.print("Author: ");

  Author[] authors = (Author[])books.getAuthors().toArray();

  for(int j=0;j<authors.length;j++){< p="">

  System.out.println(authors[j]);

  }

  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對象。

  在testInterceptedEjb()方法,JNDI查找名稱 - 的“LibraryPersistenceBean/遠程”獲得遠程業務對象(無狀態的EJB)。

  然後用戶顯示一個庫存儲的用戶界面和他/她被要求輸入選擇。

  如果用戶輸入1,系統要求輸入書籍名稱和節約使用無狀態的會話bean addBook()方法的書。會話Bean在數據庫中存儲的書。

  如果用戶輸入2,系統檢索書使用狀態會話Bean getBooks()方法和退出。

  運行客戶端訪問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 Author name: Robert

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

  Welcome to Book Store

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

  Options

  1. Add Book

  2. Exit

  Enter Choice: 2

  Book(s) entered so far: 1

  1. learn html5

  Author: Robert

  BUILD SUCCESSFUL (total time: 21 seconds)

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

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