EJB - Varlık İlişkileri
EJB 3.0, bire bir, bire çok, çoktan bire ve çoktan çoğa ilişkiler gibi veritabanı varlık ilişkilerini / eşlemelerini tanımlama seçeneği sağlar.
İlgili ek açıklamalar aşağıdadır -
One-to-One- Nesnelerin bire bir ilişkisi vardır. Örneğin, bir yolcu aynı anda tek bir bilet kullanarak seyahat edebilir.
One-to-Many- Nesnelerin bire çok ilişkisi vardır. Örneğin, bir babanın birden fazla çocuğu olabilir.
Many-to-One- Nesnelerin bire bir ilişkisi vardır. Örneğin, bekar bir anneye sahip birden çok çocuk.
Many-to-Many- Nesnelerin çoka çok ilişkisi vardır. Örneğin, bir kitabın birden çok yazarı olabilir ve bir yazar birden çok kitap yazabilir.
ManyToMany eşlemesinin kullanımını burada göstereceğiz. ManyToMany ilişkisini temsil etmek için aşağıdaki üç tablo gereklidir -
Book - Kitap kayıtları olan kitap tablosu.
Author - Yazarın kayıtlarını içeren yazar tablosu.
Book_Author - Yukarıda belirtilen Kitap ve Yazar tablosu ile bağlantılı Kitap Yazar tablosu.
Tablo Oluşturun
Tablo oluştur book author, book_author varsayılan veritabanında 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
);
Varlık Sınıfları Oluşturun
@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<Author> authors;
...
}
Book Entity'de ManyToMany ek açıklamasını kullanın.
@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<Author> getAuthors() {
return authors;
}
...
}
Örnek Uygulama
EJB 3.0'daki varlık ilişkileri nesnelerini test etmek için bir test EJB uygulaması oluşturalım.
Adım | Açıklama |
---|---|
1 | EJB - Uygulama Oluştur bölümünde açıklandığı gibi com.tutorialspoint.entity paketinin altında EjbComponent adıyla bir proje oluşturun . EJB konseptlerindeki gömülü nesneleri anlamak için lütfen bu bölümde olduğu gibi EJB - Kalıcılık bölümünde oluşturulan projeyi kullanın . |
2 | Oluşturma Author.java paket altında com.tutorialspoint.entity açıklandığı gibi EJB - Uygulama oluşturun bölüm. Geri kalan dosyaları değiştirmeden tutun. |
3 | Oluşturma Book.java paket altında com.tutorialspoint.entity . EJB - Persistence bölümünü referans olarak kullanın . Geri kalan dosyaları değiştirmeden tutun. |
4 | İş mantığının gereksinimlere göre çalıştığından emin olmak için uygulamayı temizleyin ve oluşturun. |
5 | Son olarak, uygulamayı JBoss Uygulama Sunucusunda jar dosyası biçiminde dağıtın. Henüz başlatılmamışsa JBoss Uygulama sunucusu otomatik olarak başlayacaktır. |
6 | Şimdi, başlık altındaki EJB - Uygulama Oluştur bölümünde açıklandığı gibi, konsol tabanlı bir uygulama olan EJB istemcisini oluşturun.Create Client to access EJB. |
EJBComponent (EJB Modülü)
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<Author> 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<Author> 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<Author> 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<Book> 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<Book> getBooks() {
return entityManager.createQuery("From Book").getResultList();
}
}
EjbComponent projesini JBOSS üzerinde dağıtır dağıtmaz, jboss günlüğüne dikkat edin.
JBoss, oturum fasulyemiz için otomatik olarak bir JNDI girişi oluşturdu - LibraryPersistentBean/remote.
Bu arama dizesini, türündeki uzak iş nesnesini elde etmek için kullanacağız - com.tutorialspoint.interceptor.LibraryPersistentBeanRemote
JBoss Uygulama Sunucusu Günlük Çıktısı
...
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 İstemcisi)
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
Bu özellikler, java adlandırma hizmetinin InitialContext nesnesini başlatmak için kullanılır.
InitialContext nesnesi, durum bilgisiz oturum çekirdeğini aramak için kullanılacaktır.
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<Author> authors = new HashSet<Author>();
authors.add(author);
book.setAuthors(authors);
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());
System.out.print("Author: ");
Author[] authors = (Author[])books.getAuthors().toArray();
for(int j=0;j<authors.length;j++) {
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 aşağıdaki görevleri gerçekleştirir -
Jndi.properties dosyasından özellikleri yükleyin ve InitialContext nesnesini başlatın.
TestInterceptedEjb () yönteminde jndi araması, uzak iş nesnesini (durum bilgisiz EJB) elde etmek için "LibraryPersistenceBean / remote" adıyla yapılır.
Ardından kullanıcıya bir kütüphane mağazası Kullanıcı Arayüzü gösterilir ve kendisinden bir seçim girmesi istenir.
Kullanıcı 1 girerse, sistem kitap adını sorar ve kitabı durum bilgisi olmayan oturum bean addBook () yöntemini kullanarak kaydeder. Session Bean kitabı veri tabanında saklıyor.
Kullanıcı 2 girerse, sistem kitapları durumsuz oturum bean getBooks () yöntemini kullanarak alır ve çıkar.
EJB'ye Erişmek için İstemciyi Çalıştırın
Proje gezgininde EJBTester.java'yı bulun. EJBTester sınıfına sağ tıklayın ve seçinrun file.
Netbeans konsolunda aşağıdaki çıktıyı doğrulayın.
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)