JPA - Hướng dẫn nhanh

Bất kỳ ứng dụng doanh nghiệp nào cũng thực hiện các hoạt động cơ sở dữ liệu bằng cách lưu trữ và truy xuất một lượng lớn dữ liệu. Bất chấp tất cả các công nghệ hiện có để quản lý lưu trữ, các nhà phát triển ứng dụng thường phải vật lộn để thực hiện các hoạt động cơ sở dữ liệu một cách hiệu quả.

Nói chung, các nhà phát triển Java sử dụng rất nhiều mã hoặc sử dụng khuôn khổ độc quyền để tương tác với cơ sở dữ liệu, trong khi sử dụng JPA, gánh nặng tương tác với cơ sở dữ liệu giảm đáng kể. Nó tạo thành cầu nối giữa mô hình đối tượng (chương trình Java) và mô hình quan hệ (chương trình cơ sở dữ liệu).

Không khớp giữa mô hình quan hệ và mô hình đối tượng

Các đối tượng quan hệ được biểu diễn dưới dạng bảng, trong khi các mô hình đối tượng được biểu diễn dưới dạng biểu đồ liên kết của định dạng đối tượng. Trong khi lưu trữ và truy xuất một mô hình đối tượng từ cơ sở dữ liệu quan hệ, một số không khớp xảy ra do những lý do sau:

  • Granularity : Mô hình đối tượng có độ chi tiết hơn mô hình quan hệ.

  • Subtypes : Các kiểu con (có nghĩa là kế thừa) không được hỗ trợ bởi tất cả các loại cơ sở dữ liệu quan hệ.

  • Identity : Giống như mô hình đối tượng, mô hình quan hệ không tiết lộ danh tính trong khi viết bình đẳng.

  • Associations : Mô hình quan hệ không thể xác định nhiều mối quan hệ trong khi xem xét mô hình miền đối tượng.

  • Data navigation : Điều hướng dữ liệu giữa các đối tượng trong mạng đối tượng là khác nhau trong cả hai mô hình.

JPA là gì?

Java Persistence API là một tập hợp các lớp và phương thức để lưu trữ liên tục một lượng lớn dữ liệu vào cơ sở dữ liệu do Oracle Corporation cung cấp.

Sử dụng JPA ở đâu?

Để giảm bớt gánh nặng viết mã cho việc quản lý đối tượng quan hệ, một lập trình viên tuân theo khuôn khổ 'Nhà cung cấp JPA', cho phép tương tác dễ dàng với cá thể cơ sở dữ liệu. Ở đây, khung bắt buộc được JPA tiếp quản.

Lịch sử JPA

Các phiên bản trước đó của EJB, lớp bền vững được xác định kết hợp với lớp logic nghiệp vụ bằng cách sử dụng Giao diện javax.ejb.EntityBean.

  • Trong khi giới thiệu EJB 3.0, lớp bền vững đã được tách ra và được chỉ định là JPA 1.0 (Java Persistence API). Các thông số kỹ thuật của API này đã được phát hành cùng với các thông số kỹ thuật của JAVA EE5 vào ngày 11 tháng 5 năm 2006 sử dụng JSR 220.

  • JPA 2.0 được phát hành với các thông số kỹ thuật của JAVA EE6 vào ngày 10 tháng 12 năm 2009 như một phần của Quy trình cộng đồng Java JSR 317.

  • JPA 2.1 được phát hành với đặc điểm kỹ thuật của JAVA EE7 vào ngày 22 tháng 4 năm 2013 sử dụng JSR 338.

Nhà cung cấp JPA

JPA là một API mã nguồn mở, do đó các nhà cung cấp doanh nghiệp khác nhau như Oracle, Redhat, Eclipse, v.v. cung cấp các sản phẩm mới bằng cách thêm hương vị bền vững JPA vào chúng. Một số sản phẩm này bao gồm:

Hibernate, Eclipselink, Toplink, Spring Data JPA, etc.

Java Persistence API là một nguồn để lưu trữ các thực thể kinh doanh dưới dạng các thực thể quan hệ. Nó chỉ ra cách xác định ĐỐI TƯỢNG JAVA PLAIN CŨ (POJO) là một thực thể và cách quản lý các thực thể có quan hệ.

Kiến trúc cấp độ lớp

Hình ảnh sau đây cho thấy kiến ​​trúc mức lớp của JPA. Nó hiển thị các lớp và giao diện cốt lõi của JPA.

Bảng sau đây mô tả từng đơn vị được hiển thị trong kiến ​​trúc trên.

Các đơn vị Sự miêu tả
EntityManagerFactory Đây là một lớp nhà máy của EntityManager. Nó tạo và quản lý nhiều cá thể EntityManager.
EntityManager Nó là một Giao diện, nó quản lý các hoạt động liên tục trên các đối tượng. Nó hoạt động giống như nhà máy cho phiên bản Truy vấn.
Entity Các thực thể là các đối tượng tồn tại, lưu trữ dưới dạng các bản ghi trong cơ sở dữ liệu.
EntityTransaction Nó có mối quan hệ 1-1 với EntityManager. Đối với mỗi EntityManager, các hoạt động được duy trì bởi lớp EntityTransaction.
Persistence Lớp này chứa các phương thức tĩnh để lấy thể hiện EntityManagerFactory.
Query Giao diện này được thực hiện bởi mỗi nhà cung cấp JPA để có được các đối tượng quan hệ đáp ứng các tiêu chí.

Các lớp và giao diện trên được sử dụng để lưu trữ các thực thể vào cơ sở dữ liệu dưới dạng bản ghi. Chúng giúp các lập trình viên giảm bớt nỗ lực viết mã để lưu trữ dữ liệu vào cơ sở dữ liệu để họ có thể tập trung vào các hoạt động quan trọng hơn như viết mã để ánh xạ các lớp với bảng cơ sở dữ liệu.

Mối quan hệ lớp JPA

Trong kiến ​​trúc trên, các quan hệ giữa các lớp và giao diện thuộc về gói javax.persistence. Sơ đồ sau đây cho thấy mối quan hệ giữa chúng.

  • Mối quan hệ giữa EntityManagerFactory và EntityManager là one-to-many. Nó là một lớp nhà máy đối với các cá thể EntityManager.

  • Mối quan hệ giữa EntityManager và EntityTransaction là one-to-one. Đối với mỗi hoạt động EntityManager, có một cá thể EntityTransaction.

  • Mối quan hệ giữa EntityManager và Query là one-to-many. Nhiều số lượng truy vấn có thể thực thi bằng một phiên bản EntityManager.

  • Mối quan hệ giữa EntityManager và Entity là one-to-many. Một cá thể EntityManager có thể quản lý nhiều Thực thể.

Hầu hết các ứng dụng đương đại sử dụng cơ sở dữ liệu quan hệ để lưu trữ dữ liệu. Gần đây, nhiều nhà cung cấp chuyển sang cơ sở dữ liệu đối tượng để giảm bớt gánh nặng cho việc bảo trì dữ liệu. Nó có nghĩa là cơ sở dữ liệu đối tượng hoặc các công nghệ quan hệ đối tượng đang đảm nhận việc lưu trữ, truy xuất, cập nhật và duy trì dữ liệu. Phần cốt lõi của công nghệ quan hệ đối tượng này là ánh xạ các tệp orm.xml. Vì xml không yêu cầu biên dịch, chúng tôi có thể dễ dàng thực hiện thay đổi đối với nhiều nguồn dữ liệu với ít quản lý hơn.

Bản đồ quan hệ giữa các đối tượng

Ánh xạ quan hệ đối tượng (ORM) cho bạn biết ngắn gọn về ORM là gì và nó hoạt động như thế nào. ORM là một khả năng lập trình để che giấu dữ liệu từ kiểu đối tượng sang kiểu quan hệ và ngược lại.

Tính năng chính của ORM là ánh xạ hoặc liên kết một đối tượng với dữ liệu của nó trong cơ sở dữ liệu. Trong khi ánh xạ, chúng ta phải xem xét dữ liệu, loại dữ liệu và mối quan hệ của nó với thực thể tự hoặc các thực thể trong bất kỳ bảng nào khác.

Các tính năng tiên tiến

  • Idiomatic persistence : Nó cho phép bạn viết các lớp bền bỉ bằng cách sử dụng các lớp hướng đối tượng.

  • High Performance : Nó có nhiều kỹ thuật tìm nạp và kỹ thuật khóa đầy hy vọng.

  • Reliable : Nó có độ ổn định cao và được sử dụng bởi nhiều lập trình viên chuyên nghiệp.

Kiến trúc ORM

Kiến trúc ORM trông như sau.

Kiến trúc trên giải thích cách dữ liệu đối tượng được lưu trữ vào cơ sở dữ liệu quan hệ trong ba giai đoạn.

Giai đoạn 1

Giai đoạn đầu tiên, được đặt tên là object data phase, chứa các lớp POJO, giao diện dịch vụ và các lớp. Đây là lớp thành phần nghiệp vụ chính, có các hoạt động và thuộc tính logic nghiệp vụ.

Ví dụ, chúng ta hãy lấy cơ sở dữ liệu nhân viên dưới dạng lược đồ.

  • Lớp POJO của nhân viên chứa các thuộc tính như ID, tên, lương và chỉ định. Nó cũng chứa các phương thức như setter và getter của các thuộc tính đó.

  • Các lớp DAO / Service của nhân viên chứa các phương thức dịch vụ như tạo nhân viên, tìm nhân viên và xóa nhân viên.

Giai đoạn 2

Giai đoạn thứ hai, được đặt tên là mapping hoặc là persistence phase, chứa nhà cung cấp JPA, tệp ánh xạ (ORM.xml), Bộ tải JPA và Lưới đối tượng.

  • JPA Provider: Đây là sản phẩm của nhà cung cấp có chứa hương vị JPA (javax.persistence). Ví dụ: Eclipselink, Toplink, Hibernate, v.v.

  • Mapping file : Tệp ánh xạ (ORM.xml) chứa cấu hình ánh xạ giữa dữ liệu trong lớp POJO và dữ liệu trong cơ sở dữ liệu quan hệ.

  • JPA Loader: Bộ tải JPA hoạt động giống như một bộ nhớ đệm. Nó có thể tải dữ liệu lưới quan hệ. Nó hoạt động giống như một bản sao của cơ sở dữ liệu để tương tác với các lớp dịch vụ cho dữ liệu POJO (thuộc tính của lớp POJO).

  • Object Grid: Nó là một vị trí tạm thời có thể lưu trữ một bản sao của dữ liệu quan hệ, giống như một bộ nhớ đệm. Tất cả các truy vấn đối với cơ sở dữ liệu trước tiên được thực hiện trên dữ liệu trong lưới đối tượng. Chỉ sau khi nó được cam kết, nó mới ảnh hưởng đến cơ sở dữ liệu chính.

Giai đoạn 3

Giai đoạn thứ ba là relational data phase. Nó chứa dữ liệu quan hệ được kết nối một cách hợp lý với thành phần nghiệp vụ. Như đã thảo luận ở trên, chỉ khi thành phần nghiệp vụ cam kết dữ liệu, dữ liệu đó mới được lưu trữ vào cơ sở dữ liệu một cách vật lý. Cho đến lúc đó, dữ liệu đã sửa đổi được lưu trữ trong bộ nhớ đệm ở dạng lưới. Quá trình thu thập dữ liệu giống với quá trình lưu trữ dữ liệu.

Cơ chế tương tác theo chương trình của ba giai đoạn trên được gọi là object relational mapping.

Mapping.xml

Tệp mapping.xml là để hướng dẫn nhà cung cấp JPA ánh xạ các lớp Thực thể với các bảng cơ sở dữ liệu.

Hãy để chúng tôi lấy một ví dụ về thực thể Nhân viên chứa bốn thuộc tính. Lớp POJO của thực thể Nhân viên có tênEmployee.java là như sau:

public class Employee 
{
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	public Employee(int eid, String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
    public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
}

Đoạn mã trên là lớp POJO của thực thể Nhân viên. Nó chứa bốn thuộc tínheid, ename, salarydeg. Hãy coi các thuộc tính này như các trường bảng trong một bảng vàeidlàm khóa chính của bảng này. Bây giờ chúng ta phải thiết kế tệp ánh xạ ngủ đông cho nó. Tệp ánh xạ có tênmapping.xml là như sau:

<? xml version="1.0" encoding="UTF-8" ?>
<entity-mappings xmlns="http://java.sun.com/xml/ns/persistence/orm"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence/orm    
                        http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
                        version="1.0">
    <description> XML Mapping file</description>
    <entity class="Employee">        
        <table name="EMPLOYEETABLE"/>
        <attributes>
            <id name="eid">
                <generated-value strategy="TABLE"/>
            </id>
            <basic name="ename">
                <column name="EMP_NAME" length="100"/>
            </basic>
            <basic name="salary">
            </basic>
            <basic name="deg">
            </basic>
        </attributes>
    </entity>
</entity-mappings>

Tập lệnh trên được sử dụng để ánh xạ lớp thực thể với bảng cơ sở dữ liệu. Trong tập tin này

  • <entity-mappings> : thẻ xác định định nghĩa lược đồ để cho phép các thẻ thực thể vào tệp xml.

  • <description> : thẻ cung cấp mô tả về ứng dụng.

  • <entity>: thẻ định nghĩa lớp thực thể mà bạn muốn chuyển đổi thành bảng trong cơ sở dữ liệu. Lớp thuộc tính xác định tên lớp thực thể POJO.

  • <table>: thẻ xác định tên bảng. Nếu bạn muốn có các tên giống nhau cho cả lớp cũng như bảng thì thẻ này không cần thiết.

  • <attributes> : thẻ xác định các thuộc tính (các trường trong bảng).

  • <id>: thẻ xác định khóa chính của bảng. Các<generated-value> thẻ xác định cách chỉ định giá trị khóa chính, chẳng hạn như Automatic, Manual, hoặc lấy từ Sequence.

  • <basic> : thẻ được sử dụng để xác định các thuộc tính còn lại cho bảng.

  • <column-name> : thẻ được sử dụng để xác định tên trường bảng do người dùng xác định trong bảng.

Chú thích

Nói chung, các tệp xml được sử dụng để định cấu hình các thành phần cụ thể hoặc ánh xạ hai thông số kỹ thuật khác nhau của các thành phần. Trong trường hợp của chúng tôi, chúng tôi phải duy trì các tệp xml riêng biệt trong một khuôn khổ. Điều đó có nghĩa là trong khi viết tệp xml ánh xạ, chúng ta cần so sánh các thuộc tính lớp POJO với các thẻ thực thể trong tệp mapping.xml.

Đây là giải pháp. Trong định nghĩa lớp, chúng ta có thể viết phần cấu hình bằng cách sử dụng chú thích. Chú thích được sử dụng cho các lớp, thuộc tính và phương thức. Chú thích bắt đầu bằng ký hiệu '@'. Chú thích được khai báo trước một lớp, thuộc tính hoặc phương thức. Tất cả các chú thích của JPA được xác định trongjavax.persistence gói hàng.

Dưới đây là danh sách các chú thích được sử dụng trong các ví dụ của chúng tôi.

Chú thích Sự miêu tả
@Entity Khai báo lớp dưới dạng một thực thể hoặc một bảng.
@Bàn Khai báo tên bảng.
@Căn bản Chỉ định các trường không ràng buộc một cách rõ ràng.
@Embedded Chỉ định các thuộc tính của lớp hoặc một thực thể có giá trị là một thể hiện của một lớp có thể nhúng.
@Tôi Chỉ định thuộc tính, sử dụng cho danh tính (khóa chính của bảng) của lớp.
@GeneratedValue Chỉ định cách khởi tạo thuộc tính nhận dạng, chẳng hạn như tự động, thủ công hoặc giá trị được lấy từ bảng trình tự.
@Tạm thời Chỉ định thuộc tính không liên tục, tức là giá trị không bao giờ được lưu trữ trong cơ sở dữ liệu.
@Cột Chỉ định thuộc tính cột cho thuộc tính kiên trì.
@SequenceGenerator Chỉ định giá trị cho thuộc tính được chỉ định trong chú thích @GeneratedValue. Nó tạo ra một chuỗi.
@TableGenerator Chỉ định trình tạo giá trị cho thuộc tính được chỉ định trong chú thích @GeneratedValue. Nó tạo ra một bảng để tạo giá trị.
@Loại truy cập Loại chú thích này được sử dụng để đặt loại truy cập. Nếu bạn đặt @AccessType (FIELD), thì việc truy cập xảy ra Trường khôn ngoan. Nếu bạn đặt @AccessType (THUỘC TÍNH), thì quyền truy cập sẽ xảy ra Thuộc tính khôn ngoan.
@JoinColumn Chỉ định một liên kết thực thể hoặc tập hợp thực thể. Điều này được sử dụng trong nhiều hiệp hội-một và một-nhiều.
@Hạn chế duy nhất Chỉ định các trường và các ràng buộc duy nhất cho bảng chính hoặc bảng phụ.
@ColumnResult Tham chiếu đến tên của một cột trong truy vấn SQL bằng mệnh đề select.
@Nhiều nhiều Xác định mối quan hệ nhiều-nhiều giữa các Bảng nối.
@ManyToOne Xác định mối quan hệ nhiều-một giữa các Bảng nối.
@OneToMany Xác định mối quan hệ một-nhiều giữa các Bảng nối.
@OneToOne Xác định mối quan hệ một-một giữa các Bảng nối.
@NamedQueries chỉ định danh sách các truy vấn được đặt tên.
@NamedQuery Chỉ định một Truy vấn sử dụng tên tĩnh.

Tiêu chuẩn Java Bean

Lớp Java đóng gói các giá trị cá thể và các hành vi của chúng vào một đơn vị duy nhất được gọi là đối tượng. Java Bean là một thành phần lưu trữ tạm thời và có thể tái sử dụng hoặc một đối tượng. Nó là một lớp có thể tuần tự hóa, có một hàm tạo mặc định và các phương thức getter và setter để khởi tạo các thuộc tính cá thể riêng lẻ.

Quy ước về đậu

  • Bean chứa hàm tạo mặc định của nó hoặc một tệp chứa cá thể được tuần tự hóa. Do đó, một hạt đậu có thể liền một hạt đậu khác.

  • Các thuộc tính của bean có thể được tách thành thuộc tính Boolean hoặc thuộc tính không Boolean.

  • Thuộc tính không Boolean chứa gettersetter các phương pháp.

  • Thuộc tính boolean chứa setteris phương pháp.

  • Getter phương pháp của bất kỳ tài sản nào nên bắt đầu bằng chữ cái nhỏ get(quy ước phương thức java) và tiếp tục với tên trường bắt đầu bằng chữ hoa. Ví dụ, tên trường làsalary do đó phương pháp getter của trường này là getSalary ().

  • Setter phương pháp của bất kỳ tài sản nào nên bắt đầu bằng chữ cái nhỏ set (quy ước phương thức java), tiếp tục với tên trường bắt đầu bằng chữ in hoa và argument valueđể đặt thành trường. Ví dụ, tên trường làsalary do đó phương pháp setter của trường này là setSalary ( double sal ).

  • Đối với thuộc tính Boolean, isphương pháp để kiểm tra xem nó đúng hay sai. Ví dụ, thuộc tính Booleanempty, các is phương pháp của trường này là isEmpty ().

Chương này sẽ hướng dẫn bạn quá trình thiết lập JPA trên các hệ thống chạy Windows và Linux. JPA có thể được cài đặt và tích hợp dễ dàng với môi trường Java hiện tại của bạn theo một vài bước đơn giản mà không cần bất kỳ thủ tục thiết lập phức tạp nào. Quản trị người dùng được yêu cầu trong khi cài đặt.

yêu cầu hệ thống

JDK Java SE 2 JDK 1.5 trở lên
Ký ức RAM 1 GB (khuyến nghị)
Dung lượng đĩa Không có yêu cầu tối thiểu
Phiên bản hệ điều hành Windows XP trở lên, Linux

Bây giờ chúng ta hãy tiến hành các bước cài đặt JPA.

Bước 1: Xác minh cài đặt Java của bạn

Trước hết, bạn cần cài đặt Bộ phát triển phần mềm Java (SDK) trên hệ thống của mình. Để xác minh điều này, hãy thực hiện bất kỳ lệnh nào trong hai lệnh sau tùy thuộc vào nền tảng bạn đang làm việc.

Nếu cài đặt Java đã được thực hiện đúng cách, thì nó sẽ hiển thị phiên bản hiện tại và đặc điểm kỹ thuật của cài đặt Java của bạn. Đầu ra mẫu được đưa ra trong bảng sau.

Nền tảng Chỉ huy Đầu ra mẫu
các cửa sổ

Mở bảng điều khiển lệnh và nhập:

\>java –version

Phiên bản Java "1.7.0_60"

Môi trường thời gian chạy Java (TM) SE (bản dựng 1.7.0_60-b19)

Java Hotspot (TM) 64-bit Server VM (bản dựng 24.60-b09, chế độ hỗn hợp)

Linux

Mở đầu cuối lệnh và nhập:

$java –version

phiên bản java "1.7.0_25"

Mở môi trường thời gian chạy JDK (rhel-2.3.10.4.el6_4-x86_64)

Mở JDK 64-Bit Server VM (bản dựng 23.7-b01, chế độ hỗn hợp)

  • Chúng tôi giả định rằng người đọc của hướng dẫn này đã cài đặt Java SDK phiên bản 1.7.0_60 trên hệ thống của họ.

  • Trong trường hợp bạn không có Java SDK, hãy tải xuống phiên bản hiện tại của nó từ http://www.oracle.com/technetwork/java/javase/downloads/index.html và đã cài đặt nó.

Bước 2: Đặt Môi trường Java của bạn

Đặt biến môi trường JAVA_HOME trỏ đến vị trí thư mục cơ sở nơi Java được cài đặt trên máy của bạn. Ví dụ,

Nền tảng Sự miêu tả
các cửa sổ Đặt JAVA_HOME thành C: \ ProgramFiles \ java \ jdk1.7.0_60
Linux Xuất JAVA_HOME = / usr / local / java-current

Nối đường dẫn đầy đủ của vị trí trình biên dịch Java vào Đường dẫn hệ thống.

Nền tảng Sự miêu tả
các cửa sổ Nối chuỗi "C: \ Program Files \ Java \ jdk1.7.0_60 \ bin" vào cuối biến hệ thống PATH.
Linux Xuất PATH = $ PATH: $ JAVA_HOME / bin /

Thực hiện lệnh java -version từ dấu nhắc lệnh như đã giải thích ở trên.

Bước 3: Cài đặt JPA

Bạn có thể thực hiện cài đặt JPA bằng cách sử dụng bất kỳ Nhà cung cấp JPA nào từ hướng dẫn này, ví dụ: Eclipselink, Hibernate. Hãy để chúng tôi theo dõi cài đặt JPA bằng Eclipselink. Đối với lập trình JPA, chúng tôi yêu cầu tuân theo khung thư mục cụ thể, do đó tốt hơn là sử dụng IDE.

Tải xuống biểu mẫu IDE Eclipse sau liên kết sau https://www.eclipse.org/downloads/ Chọn EclipseIDE cho nhà phát triển JavaEE Eclipse indigo.

Giải nén tệp zip Eclipse trong ổ C. Mở IDE Eclipse.

Cài đặt JPA bằng Eclipselink

Eclipselink là một thư viện do đó chúng ta không thể thêm nó trực tiếp vào Eclipse IDE. Để cài đặt JPA bằng Eclipselink, bạn cần làm theo các bước dưới đây.

  • Tạo một dự án JPA mới bằng cách chọn File->New->JPA Project trong IDE Eclipse như sau:

  • Bạn sẽ nhận được một hộp thoại có tên New JPA Project. Nhập tên dự ántutorialspoint_JPA_Eclipselink, kiểm tra jre phiên bản và nhấp vào tiếp theo:

  • Nhấp vào thư viện tải xuống (nếu bạn không có thư viện) trong phần thư viện người dùng.

  • Chọn phiên bản mới nhất của thư viện Eclipselink trong hộp thoại Tải xuống thư viện và nhấp vào tiếp theo như sau:

  • Chấp nhận các điều khoản của giấy phép và nhấp vào kết thúc để tải xuống thư viện.

  • 6. Quá trình tải xuống bắt đầu như được hiển thị trong ảnh chụp màn hình sau.

  • Sau khi tải xuống, hãy chọn thư viện đã tải xuống trong phần thư viện người dùng và nhấp vào kết thúc.

  • Cuối cùng, bạn nhận được tệp dự án trong Package Explorertrong IDE Eclipse. Giải nén tất cả các tệp, bạn sẽ nhận được phân cấp thư mục và tệp như sau:

Thêm trình kết nối MySQL vào Dự án

Bất kỳ ví dụ nào mà chúng ta thảo luận ở đây đều yêu cầu kết nối cơ sở dữ liệu. Chúng ta hãy xem xét cơ sở dữ liệu MySQL cho các hoạt động cơ sở dữ liệu. Nó yêu cầu jar mysql-connector để tương tác với một chương trình Java.

Làm theo các bước để cấu hình jar cơ sở dữ liệu trong dự án của bạn.

  • Chuyển đến Thuộc tính dự án ->Java Build Path bằng cách nhấp chuột phải vào nó. Bạn sẽ nhận được một hộp thoại như trong ảnh chụp màn hình sau đây. Nhấp vào Thêm lọ bên ngoài.

  • Đi đến vị trí jar trong bộ nhớ hệ thống của bạn, chọn tệp và nhấp vào mở.

  • Nhấp vào ok trên hộp thoại thuộc tính. Bạn sẽ nhận được MySQL-connector Jar vào dự án của mình. Bây giờ bạn có thể thực hiện các hoạt động cơ sở dữ liệu bằng MySQL.

Chương này sử dụng một ví dụ đơn giản để chứng minh cách hoạt động của JPA. Chúng ta hãy coi Quản lý nhân viên là một ví dụ. Giả sử Quản lý nhân viên tạo, cập nhật, tìm và xóa các bản ghi của một nhân viên. Như đã đề cập, chúng tôi đang sử dụng cơ sở dữ liệu MySQL cho các hoạt động cơ sở dữ liệu.

Các mô-đun chính cho ví dụ này như sau:

  • Model or POJO

    Employee.java

  • Persistence

    Persistence.xml

  • Service

    CreatingEmployee.java

    UpdatingEmployee.java

    FindingEmployee.java

    DeletingEmployee.java

Hãy để chúng tôi phân cấp gói mà chúng tôi đã sử dụng trong cài đặt JPA với Eclipselink. Thực hiện theo hệ thống phân cấp cho ví dụ này như được hiển thị bên dưới:

Tạo thực thể

Các thực thể không có gì khác ngoài hạt đậu hoặc mô hình. Trong ví dụ này, chúng tôi sẽ sử dụngEmployee như một thực thể. eid, ename, salarydeglà các thuộc tính của thực thể này. Nó chứa một hàm tạo mặc định cũng như các phương thức setter và getter của các thuộc tính đó.

Trong hệ thống phân cấp được hiển thị ở trên, hãy tạo một gói có tên ‘com.tutorialspoint.eclipselink.entity’, Dưới ‘src’(Nguồn) gói. Tạo một lớp có tênEmployee.java theo gói nhất định như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table
public class Employee 
{
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	public Employee(int eid, String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
    public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
	@Override
	public String toString() {
		return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
				+ salary + ", deg=" + deg + "]";
	}
}

Trong đoạn mã trên, chúng tôi đã sử dụng chú thích @Entity để biến lớp POJO này thành một thực thể.

Trước khi chuyển sang mô-đun tiếp theo, chúng ta cần tạo cơ sở dữ liệu cho thực thể quan hệ, thực thể này sẽ đăng ký cơ sở dữ liệu trong persistence.xmltập tin. Mở bàn làm việc MySQL và nhập truy vấn hte sau.

create database jpadb
use jpadb

Persistence.xml

Mô-đun này đóng một vai trò quan trọng trong khái niệm JPA. Trong tệp xml này, chúng tôi sẽ đăng ký cơ sở dữ liệu và chỉ định lớp thực thể.

Trong phân cấp gói được hiển thị ở trên, Persence.xml trong gói Nội dung JPA như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
                         	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<properties>
	   <property name="javax.persistence.jdbc.url"
                   value="jdbc:mysql://localhost:3306/jpadb"/>
     	   <property name="javax.persistence.jdbc.user" value="root"/>
	       <property name="javax.persistence.jdbc.password" value="root"/>
	       <property name="javax.persistence.jdbc.driver"
                   value="com.mysql.jdbc.Driver"/>
           <property name="eclipselink.logging.level" value="FINE"/>
	       <property name="eclipselink.ddl-generation" 
		           value="create-tables"/>
	</properties>
	</persistence-unit>
</persistence>

Trong xml ở trên, <persistence-unit> thẻ được xác định với một tên cụ thể cho sự tồn tại của JPA. Các<class>thẻ định nghĩa lớp thực thể với tên gói. Các<properties> thẻ xác định tất cả các thuộc tính và <property>thẻ xác định từng thuộc tính như đăng ký cơ sở dữ liệu, đặc tả URL, tên người dùng và mật khẩu. Đây là các thuộc tính Eclipselink. Tệp này sẽ cấu hình cơ sở dữ liệu.

Hoạt động bền bỉ

Các hoạt động liên tục được sử dụng để tương tác với cơ sở dữ liệu và chúng loadstorecác hoạt động. Trong một thành phần nghiệp vụ, tất cả các hoạt động liên tục thuộc các lớp dịch vụ.

Trong phân cấp gói được hiển thị ở trên, hãy tạo một gói có tên ‘com.tutorialspoint.eclipselink.service’, Dưới ‘src’(nguồn) gói. Tất cả các lớp dịch vụ có tên là CreateEmloyee.java, UpdateEaffee.java, FindEaffee.java và DeleteEprisee.java. đi kèm theo gói nhất định như sau:

Tạo nhân viên

Đoạn mã sau đây cho thấy cách tạo một lớp Nhân viên có tên CreateEmployee.java.

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Employee;

public class CreateEmployee 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		Employee employee = new Employee( ); 
		employee.setEid( 1201 );
		employee.setEname( "Gopal" );
		employee.setSalary( 40000 );
		employee.setDeg( "Technical Manager" );
		entitymanager.persist( employee );
		entitymanager.getTransaction( ).commit( );
		
		entitymanager.close( );
		emfactory.close( );
	}
}

Trong đoạn mã trên, createEntityManagerFactory ()tạo đơn vị độ bền bằng cách cung cấp cùng một tên duy nhất mà chúng tôi cung cấp cho đơn vị độ bền trong tệp Persext.xml. Cácentitymanagerfactory đối tượng sẽ tạo ra entitymanger ví dụ bằng cách sử dụng createEntityManager ()phương pháp. Cácentitymanager đối tượng tạo ra entitytransactionví dụ để quản lý giao dịch. Bằng cách sử dụngentitymanager đối tượng, chúng ta có thể tồn tại các thực thể trong cơ sở dữ liệu.

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được thông báo từ thư viện eclipselink trên bảng điều khiển của eclipse IDE.

Để có kết quả, hãy mở bàn làm việc MySQL và nhập các truy vấn sau.

use jpadb
select * from employee

Bảng cơ sở dữ liệu có hiệu lực có tên employee sẽ được hiển thị dưới dạng bảng như sau:

Eid Tên Tiền lương Độ
1201 Gopal 40000 Giám đốc kỹ thuật

Cập nhật nhân viên

Để cập nhật các bản ghi của một nhân viên, chúng ta cần truy xuất các bản ghi hiện có trong cơ sở dữ liệu, thực hiện các thay đổi và cuối cùng cam kết nó vào cơ sở dữ liệu. Lớp có tênUpdateEmployee.java được hiển thị như sau:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Employee;

public class UpdateEmployee 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
				entitymanager.getTransaction( ).begin( );
		Employee employee=entitymanager.
				find( Employee.class, 1201 );
		//before update
		System.out.println( employee );
		employee.setSalary( 46000 );
		entitymanager.getTransaction( ).commit( );
        //after update
		System.out.println( employee );
		entitymanager.close();
		emfactory.close();
	}
}

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được thông báo từ thư viện Eclipselink trên bảng điều khiển của eclipse IDE.

Để có kết quả, hãy mở bàn làm việc MySQL và nhập các truy vấn sau.

use jpadb
select * from employee

Bảng cơ sở dữ liệu có hiệu lực có tên employee sẽ được hiển thị dưới dạng bảng như sau:

Eid Tên Tiền lương Độ
1201 Gopal 46000 Giám đốc kỹ thuật

Mức lương của nhân viên, 1201 được cập nhật lên 46000.

Tìm nhân viên

Để tìm hồ sơ của một nhân viên, chúng tôi sẽ phải lấy dữ liệu hiện có từ cơ sở dữ liệu và hiển thị nó. Trong thao tác này, EntityTransaction không được áp dụng khi truy xuất bản ghi.

Lớp có tên FindEmployee.java như sau.

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Employee;

public class FindEmployee 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence
				.createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager();
		Employee employee = entitymanager.
				find( Employee.class, 1201 );
		
		System.out.println("employee ID = "+employee.getEid( ));
		System.out.println("employee NAME = "+employee.getEname( ));
		System.out.println("employee SALARY = "+employee.getSalary( ));
		System.out.println("employee DESIGNATION = "+employee.getDeg( ));
	}
}

Sau khi biên dịch và thực thi chương trình trên, bạn sẽ nhận được kết quả sau từ thư viện Eclipselink trên bảng điều khiển của eclipse IDE.

employee ID = 1201
employee NAME = Gopal
employee SALARY = 46000.0
employee DESIGNATION = Technical Manager

Xóa nhân viên

Để xóa các bản ghi của một nhân viên, trước tiên chúng ta sẽ tìm các bản ghi hiện có và sau đó xóa nó. Ở đây EntityTransaction đóng một vai trò quan trọng.

Lớp có tên DeleteEmployee.java như sau:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Employee;

public class DeleteEmployee 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		Employee employee=entitymanager.
				find( Employee.class, 1201 );
		entitymanager.remove( employee );
		entitymanager.getTransaction( ).commit( );
		entitymanager.close( );
		emfactory.close( );
	}
}

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được thông báo từ thư viện Eclipselink trên bảng điều khiển của eclipse IDE.

Để có kết quả, hãy mở bàn làm việc MySQL và nhập các truy vấn sau.

use jpadb
select * from employee

Cơ sở dữ liệu có hiệu lực có tên employee sẽ có bản ghi null.

Sau khi hoàn thành tất cả các mô-đun trong ví dụ này, cấu trúc phân cấp gói và tệp trông như sau:

Chương này mô tả về JPQL và cách nó hoạt động với các đơn vị độ bền. Trong chương này, các ví dụ đã cho tuân theo cùng một cấu trúc phân cấp gói mà chúng ta đã sử dụng trong chương trước.

Ngôn ngữ truy vấn bền vững Java

JPQL là viết tắt của Java Persistence Query Language. Nó được sử dụng để tạo các truy vấn chống lại các thực thể để lưu trữ trong cơ sở dữ liệu quan hệ. JPQL được phát triển dựa trên cú pháp SQL. Nhưng nó sẽ không ảnh hưởng trực tiếp đến cơ sở dữ liệu.

JPQL có thể truy xuất dữ liệu bằng mệnh đề SELECT, có thể cập nhật hàng loạt bằng mệnh đề UPDATE và mệnh đề DELETE.

Cấu trúc truy vấn

Cú pháp JPQL rất giống với cú pháp của SQL. Có cú pháp giống SQL là một lợi thế vì SQL đơn giản và đang được sử dụng rộng rãi. SQL hoạt động trực tiếp với các bảng, bản ghi và trường cơ sở dữ liệu quan hệ, trong khi JPQL hoạt động với các lớp và phiên bản Java.

Ví dụ: một truy vấn JPQL có thể truy xuất một đối tượng thực thể hơn là tập kết quả trường từ cơ sở dữ liệu, như với SQL. Cấu trúc truy vấn JPQL như sau.

SELECT ... FROM ...
[WHERE ...]
[GROUP BY ... [HAVING ...]]
[ORDER BY ...]

Cấu trúc của các truy vấn JPQL DELETE và UPDATE như sau.

DELETE FROM ... [WHERE ...]
 
UPDATE ... SET ... [WHERE ...]

Các hàm vô hướng và tổng hợp

Hàm vô hướng trả về giá trị kết quả dựa trên giá trị đầu vào. Các hàm tổng hợp trả về các giá trị kết quả bằng cách tính toán các giá trị đầu vào.

Chúng ta sẽ sử dụng cùng một ví dụ Quản lý nhân viên như trong chương trước. Ở đây chúng ta sẽ đi qua các lớp dịch vụ sử dụng hàm vô hướng và tổng hợp của JPQL.

Hãy để chúng tôi giả sử jpadb.employee bảng chứa các bản ghi sau.

Eid Tên Tiền lương Độ
1201 Gopal 40000 Giám đốc kỹ thuật
1202 Manisha 40000 Trình đọc bằng chứng
1203 Masthanvali 40000 Người viết kỹ thuật
1204 Hài lòng 30000 Người viết kỹ thuật
1205 Krishna 30000 Người viết kỹ thuật
1206 Kiran 35000 Trình đọc bằng chứng

Tạo một lớp có tên ScalarandAggregateFunctions.java Dưới com.tutorialspoint.eclipselink.service gói như sau.

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class ScalarandAggregateFunctions 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager();
		//Scalar function
		Query query = entitymanager.
		createQuery("Select UPPER(e.ename) from Employee e");
		List<String> list=query.getResultList();
		
		for(String e:list)
		{
			System.out.println("Employee NAME :"+e);
		}
		//Aggregate function
		Query query1 = entitymanager.
				createQuery("Select MAX(e.salary) from Employee e");
		Double result=(Double) query1.getSingleResult();
		System.out.println("Max Employee Salary :"+result);
	}
}

Sau khi biên dịch và thực thi chương trình trên, bạn sẽ nhận được kết quả sau trên bảng điều khiển của Eclipse IDE.

Employee NAME :GOPAL
Employee NAME :MANISHA
Employee NAME :MASTHANVALI
Employee NAME :SATISH
Employee NAME :KRISHNA
Employee NAME :KIRAN
ax Employee Salary :40000.0

Từ khóa Giữa, Và, Giống như

Between, AndLikelà các từ khóa chính của JPQL. Những từ khóa này được sử dụng sauWhere clause trong một truy vấn.

Tạo một lớp có tên BetweenAndLikeFunctions.java Dưới com.tutorialspoint.eclipselink.service gói như sau:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.eclipselink.entity.Employee;

public class BetweenAndLikeFunctions 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
			createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
			createEntityManager();
		//Between
		Query query = entitymanager.
			createQuery( "Select e " +
					     "from Employee e " +
					     "where e.salary " +
					     "Between 30000 and 40000" )
		List<Employee> list=(List<Employee>)query.getResultList( );
		 
		for( Employee e:list )
		{
			System.out.print("Employee ID :"+e.getEid( ));
			System.out.println("\t Employee salary :"+e.getSalary( ));
		}
		
		//Like
		Query query1 = entitymanager.
			createQuery("Select e " +
					    "from Employee e " +
					    "where e.ename LIKE 'M%'");
		List<Employee> list1=(List<Employee>)query1.getResultList( );
		for( Employee e:list1 )
		{
			System.out.print("Employee ID :"+e.getEid( ));
			System.out.println("\t Employee name :"+e.getEname( ));
		}
	}
}

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được kết quả sau trong bảng điều khiển của Eclipse IDE.

Employee ID :1201	 Employee salary :40000.0
Employee ID :1202	 Employee salary :40000.0
Employee ID :1203	 Employee salary :40000.0
Employee ID :1204	 Employee salary :30000.0
Employee ID :1205	 Employee salary :30000.0
Employee ID :1206	 Employee salary :35000.0

Employee ID :1202	 Employee name :Manisha
Employee ID :1203	 Employee name :Masthanvali

Đặt hàng

Để sắp xếp các bản ghi trong JPQL, chúng tôi sử dụng mệnh đề ORDER BY. Việc sử dụng mệnh đề này giống như trong SQL, nhưng nó liên quan đến các thực thể. Ví dụ sau đây cho thấy cách sử dụng mệnh đề ORDER BY.

Tạo một lớp học Ordering.java Dưới com.tutorialspoint.eclipselink.service gói như sau:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.eclipselink.entity.Employee;

public class Ordering 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
			createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
			createEntityManager();
		//Between
		Query query = entitymanager.
			createQuery( "Select e " +
					     "from Employee e " +
					     "ORDER BY e.ename ASC" );
		List<Employee> list=(List<Employee>)query.getResultList( );
		 
		for( Employee e:list )
		{
			System.out.print("Employee ID :"+e.getEid( ));
			System.out.println("\t Employee Name :"+e.getEname( ));
		}
	}
}

biên dịch và thực thi chương trình trên, bạn sẽ tạo ra kết quả sau trong bảng điều khiển của Eclipse IDE.

Employee ID :1201	 Employee Name :Gopal
Employee ID :1206	 Employee Name :Kiran
Employee ID :1205	 Employee Name :Krishna
Employee ID :1202	 Employee Name :Manisha
Employee ID :1203	 Employee Name :Masthanvali
Employee ID :1204	 Employee Name :Satish

Truy vấn được đặt tên

Chú thích @NamedQuery được định nghĩa là một truy vấn có chuỗi truy vấn xác định trước không thể thay đổi. Ngược lại với các truy vấn động, các truy vấn được đặt tên có thể cải thiện tổ chức mã bằng cách tách các chuỗi truy vấn JPQL khỏi POJO. Nó cũng chuyển các tham số truy vấn thay vì nhúng các ký tự động vào chuỗi truy vấn và do đó tạo ra các truy vấn hiệu quả hơn.

Trước hết, hãy thêm chú thích @NamedQuery vào lớp thực thể Nhân viên có tên Employee.java Dưới com.tutorialspoint.eclipselink.entity gói như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table
@NamedQuery(query = "Select e from Employee e where e.eid = :id", 
		name = "find employee by id")
public class Employee 
{
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	public Employee(int eid, String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
	@Override
	public String toString() {
		return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
				+ salary + ", deg=" + deg + "]";
	}
}

Tạo một lớp có tên NamedQueries.java Dưới com.tutorialspoint.eclipselink.service gói như sau:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import com.tutorialspoint.eclipselink.entity.Employee;

public class NamedQueries 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
			createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
			createEntityManager();
		Query query = entitymanager.createNamedQuery(
			"find employee by id");
		query.setParameter("id", 1204);
		List<Employee> list = query.getResultList( );
		for( Employee e:list )
		{
			System.out.print("Employee ID :"+e.getEid( ));
			System.out.println("\t Employee Name :"+e.getEname( ));
		}
	}
}

Sau khi biên dịch và thực thi chương trình trên, bạn sẽ nhận được kết quả sau trong bảng điều khiển của Eclipse IDE.

Employee ID :1204	 Employee Name :Satish

Sau khi thêm tất cả các lớp trên, hệ thống phân cấp gói trông như sau:

Háo hức và Lười tìm nạp

Khái niệm quan trọng nhất của JPA là tạo một bản sao của cơ sở dữ liệu trong bộ nhớ đệm. Trong khi giao dịch với cơ sở dữ liệu, JPA đầu tiên tạo một tập hợp dữ liệu trùng lặp và chỉ khi nó được cam kết bằng cách sử dụng trình quản lý thực thể, các thay đổi mới được thực hiện trong cơ sở dữ liệu.

Có hai cách để tìm nạp các bản ghi từ cơ sở dữ liệu.

Tìm nạp háo hức

Trong quá trình tìm nạp háo hức, các đối tượng con có liên quan được tải lên tự động trong khi tìm nạp một bản ghi cụ thể.

Tìm nạp lười biếng

Trong tìm nạp lười biếng, các đối tượng có liên quan không được tải lên tự động trừ khi bạn yêu cầu cụ thể. Trước hết, nó kiểm tra tính khả dụng của các đối tượng liên quan và thông báo. Sau đó, nếu bạn gọi bất kỳ phương thức getter nào của thực thể đó, thì nó sẽ tìm nạp tất cả các bản ghi.

Có thể tìm nạp chậm khi bạn cố gắng tìm nạp các bản ghi lần đầu tiên. Bằng cách đó, một bản sao của toàn bộ bản ghi đã được lưu trữ trong bộ nhớ đệm. Tốt hơn là tìm nạp lười biếng, khôn ngoan về hiệu suất.

JPA là một thư viện được phát hành với các đặc tả Java. Do đó, nó hỗ trợ tất cả các khái niệm hướng đối tượng để thực thể tồn tại lâu dài. Cho đến bây giờ, chúng ta đã hoàn tất những kiến ​​thức cơ bản về ánh xạ quan hệ đối tượng. Chương này sẽ đưa bạn qua các ánh xạ nâng cao giữa các đối tượng và thực thể quan hệ.

Chiến lược kế thừa

Kế thừa là khái niệm cốt lõi của bất kỳ ngôn ngữ hướng đối tượng nào, do đó chúng ta có thể sử dụng các mối quan hệ hoặc chiến lược kế thừa giữa các thực thể. JPA hỗ trợ ba loại chiến lược kế thừa: SINGLE_TABLE, JOINED_TABLE và TABLE_PER_CONCRETE_CLASS.

Chúng ta hãy xem xét một ví dụ. Sơ đồ sau đây cho thấy ba lớp, viz. Nhân viên, TeachingStaff và NonTeachingStaff, và các mối quan hệ của họ.

Trong sơ đồ trên, Nhân viên là một thực thể, trong khi TeachingStaff và NonTeachingStaff là các thực thể con của Nhân viên. Ở đây chúng tôi sẽ sử dụng ví dụ trên để chứng minh cả ba chiến lược kế thừa.

Chiến lược bảng đơn

Chiến lược bảng đơn lấy tất cả các trường lớp (cả lớp siêu và lớp con) và ánh xạ chúng thành một bảng duy nhất được gọi là chiến lược SINGLE_TABLE. Ở đây giá trị phân biệt đóng một vai trò quan trọng trong việc phân biệt các giá trị của ba thực thể trong một bảng.

Chúng ta hãy xem xét ví dụ trên. TeachingStaff và NonTeachingStaff là các lớp con của Nhân viên. Theo khái niệm kế thừa, một lớp con kế thừa các thuộc tính của lớp siêu của nó. Do đó sid và sname là các trường thuộc về cả TeachingStaff và NonTeachingStaff. Tạo một dự án JPA. Tất cả các mô-đun của dự án này như sau:

Tạo thực thể

Tạo một gói có tên ‘com.tutorialspoint.eclipselink.entity’ Dưới ‘src’gói hàng. Tạo một lớp java mới có tênStaff.javatheo gói nhất định. Lớp thực thể Nhân viên được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import java.io.Serializable;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Table
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn( name="type" )
public class Staff implements Serializable 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int sid;
	private String sname;
	public Staff( int sid, String sname ) 
	{
		super( );
		this.sid = sid;
		this.sname = sname;
	}
	public Staff( ) 
	{
		super( );
	}
	public int getSid( ) 
	{
		return sid;
	}
	public void setSid( int sid ) 
	{
		this.sid = sid;
	}
	public String getSname( ) 
	{
		return sname;
	}
	public void setSname( String sname ) 
	{
		this.sname = sname;
	}
}

Trong đoạn mã trên @DescriminatorColumn chỉ định tên trường (type) và các giá trị của nó hiển thị các trường (Teaching and NonTeachingStaff) còn lại.

Tạo một lớp con (lớp) cho lớp Nhân viên có tên TeachingStaff.java phía dưới cái com.tutorialspoint.eclipselink.entitygói hàng. Lớp Thực thể TeachingStaff được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue( value="TS" )
public class TeachingStaff extends Staff 
{
	private String qualification;
	private String subjectexpertise;
	
	public TeachingStaff( int sid, String sname, 
			String qualification,String subjectexpertise ) 
	{
		super( sid, sname );
		this.qualification = qualification;
		this.subjectexpertise = subjectexpertise;
	}
	
	public TeachingStaff( ) 
	{
		super( );
	}

	public String getQualification( )
	{
		return qualification;
	}

	public void setQualification( String qualification )
	{
		this.qualification = qualification;
	}

	public String getSubjectexpertise( ) 
	{
		return subjectexpertise;
	}

	public void setSubjectexpertise( String subjectexpertise )
	{
		this.subjectexpertise = subjectexpertise;
	}
}

Tạo một lớp con (lớp) cho lớp Nhân viên có tên NonTeachingStaff.java phía dưới cái com.tutorialspoint.eclipselink.entitygói hàng. Lớp Thực thể NonTeachingStaff được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue( value = "NS" )
public class NonTeachingStaff extends Staff 
{
	private String areaexpertise;

	public NonTeachingStaff( int sid, String sname, 
			String areaexpertise ) 
	{
		super( sid, sname );
		this.areaexpertise = areaexpertise;
	}

	public NonTeachingStaff( ) 
	{
		super( );
	}

	public String getAreaexpertise( ) 
	{
		return areaexpertise;
	}

	public void setAreaexpertise( String areaexpertise )
	{
		this.areaexpertise = areaexpertise;
	}
}

Persistence.xml

Persistence.xml chứa thông tin cấu hình của cơ sở dữ liệu và thông tin đăng ký của các lớp thực thể. Tệp xml được hiển thị như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	    <class>com.tutorialspoint.eclipselink.entity.Staff</class>
		<class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>
		<class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
                            value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
                            value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
                            value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Hạng dịch vụ

Các lớp dịch vụ là phần thực hiện của thành phần nghiệp vụ. Tạo một gói dưới‘src’ gói có tên ‘com.tutorialspoint.eclipselink.service’.

Tạo một lớp có tên SaveClient.javatrong gói đã cho để lưu trữ các trường lớp Staff, TeachingStaff và NonTeachingStaff. Lớp SaveClient được hiển thị như sau:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;
import com.tutorialspoint.eclipselink.entity.TeachingStaff;

public class SaveClient 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Teaching staff entity 
		TeachingStaff ts1=new TeachingStaff(
				1,"Gopal","MSc MEd","Maths");
		TeachingStaff ts2=new TeachingStaff(
				2, "Manisha", "BSc BEd", "English");
		//Non-Teaching Staff entity
		NonTeachingStaff nts1=new NonTeachingStaff(
				3, "Satish", "Accounts");
		NonTeachingStaff nts2=new NonTeachingStaff(
				4, "Krishna", "Office Admin");
		
		//storing all entities
		entitymanager.persist(ts1);
		entitymanager.persist(ts2);
		entitymanager.persist(nts1);
		entitymanager.persist(nts2);
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được thông báo trên bảng điều khiển của Eclipse IDE. Kiểm tra bàn làm việc MySQL để biết đầu ra. Đầu ra ở định dạng bảng được hiển thị như sau:

Sid Kiểu Tên của Areaexpertise Trình độ chuyên môn Chủ đề
1 TS Gopal MSC MED Toán học
2 TS Manisha GIƯỜNG BSC Tiếng Anh
3 NS Hài lòng Tài khoản
4 NS Krishna Quản trị viên văn phòng

Cuối cùng, bạn sẽ nhận được một bảng duy nhất chứa trường của cả ba lớp với một cột phân biệt có tên Type (cánh đồng).

Chiến lược bảng đã tham gia

Chiến lược bảng đã tham gia là chia sẻ cột được tham chiếu có chứa các giá trị duy nhất để tham gia bảng và thực hiện các giao dịch dễ dàng. Chúng ta hãy xem xét ví dụ tương tự như trên.

Tạo một Dự án JPA. Tất cả các mô-đun dự án được hiển thị bên dưới.

Tạo thực thể

Tạo một gói có tên ‘com.tutorialspoint.eclipselink.entity’ Dưới ‘src’gói hàng. Tạo một lớp java mới có tênStaff.javatheo gói nhất định. Lớp thực thể Nhân viên được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.JOINED )
public class Staff implements Serializable 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int sid;
	private String sname;
	public Staff( int sid, String sname ) 
	{
		super( );
		this.sid = sid;
		this.sname = sname;
	}
	public Staff( ) 
	{
		super( );
	}
	public int getSid( ) 
	{
		return sid;
	}
	public void setSid( int sid ) 
	{
		this.sid = sid;
	}
	public String getSname( ) 
	{
		return sname;
	}
	public void setSname( String sname ) 
	{
		this.sname = sname;
	}
}

Tạo một lớp con (lớp) cho lớp Nhân viên có tên TeachingStaff.java phía dưới cái com.tutorialspoint.eclipselink.entitygói hàng. Lớp Thực thể TeachingStaff được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@PrimaryKeyJoinColumn(referencedColumnName="sid")
public class TeachingStaff extends Staff 
{
	private String qualification;
	private String subjectexpertise;
	
	public TeachingStaff( int sid, String sname, 
			String qualification,String subjectexpertise ) 
	{
		super( sid, sname );
		this.qualification = qualification;
		this.subjectexpertise = subjectexpertise;
	}
	
	public TeachingStaff( ) 
	{
		super( );
		
	}

	public String getQualification( )
	{
		return qualification;
	}

	public void setQualification( String qualification )
	{
		this.qualification = qualification;
	}

	public String getSubjectexpertise( ) 
	{
		return subjectexpertise;
	}

	public void setSubjectexpertise( String subjectexpertise )
	{
		this.subjectexpertise = subjectexpertise;
	}
}

Tạo một lớp con (lớp) cho lớp Nhân viên có tên NonTeachingStaff.java phía dưới cái com.tutorialspoint.eclipselink.entitygói hàng. Lớp Thực thể NonTeachingStaff được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@PrimaryKeyJoinColumn(referencedColumnName="sid")
public class NonTeachingStaff extends Staff 
{
	private String areaexpertise;

	public NonTeachingStaff( int sid, String sname, 
			String areaexpertise ) 
	{
		super( sid, sname );
		this.areaexpertise = areaexpertise;
	}

	public NonTeachingStaff( ) 
	{
		super( );
	}

	public String getAreaexpertise( ) 
	{
		return areaexpertise;
	}

	public void setAreaexpertise( String areaexpertise )
	{
		this.areaexpertise = areaexpertise;
	}
}

Persistence.xml

Tệp Persistence.xml chứa thông tin cấu hình của cơ sở dữ liệu và thông tin đăng ký của các lớp thực thể. Tệp xml được hiển thị như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Staff</class>
	<class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>
	<class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
                            value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
                            value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
                            value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Hạng dịch vụ

Các lớp dịch vụ là phần thực hiện của thành phần nghiệp vụ. Tạo một gói dưới‘src’ gói có tên ‘com.tutorialspoint.eclipselink.service’.

Tạo một lớp có tên SaveClient.javatrong gói đã cho để lưu trữ các trường của lớp Staff, TeachingStaff và NonTeachingStaff. Sau đó, lớp SaveClient được hiển thị như sau:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;
import com.tutorialspoint.eclipselink.entity.TeachingStaff;

public class SaveClient 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Teaching staff entity 
		TeachingStaff ts1=new TeachingStaff(
				1,"Gopal","MSc MEd","Maths");
		TeachingStaff ts2=new TeachingStaff(
				2, "Manisha", "BSc BEd", "English");
		//Non-Teaching Staff entity
		NonTeachingStaff nts1=new NonTeachingStaff(
				3, "Satish", "Accounts");
		NonTeachingStaff nts2=new NonTeachingStaff(
		4, "Krishna", "Office Admin");
		
		//storing all entities
		entitymanager.persist(ts1);
		entitymanager.persist(ts2);
		entitymanager.persist(nts1);
		entitymanager.persist(nts2);
		
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được thông báo trong bảng điều khiển của Eclipse IDE. Đối với đầu ra, hãy kiểm tra bàn làm việc MySQL.

Tại đây, ba bảng được tạo và kết quả của staff bảng được hiển thị ở dạng bảng.

Sid Loại Tên của
1 Nhân viên giảng dạy Gopal
2 Nhân viên giảng dạy Manisha
3 NonTeachingStaff Hài lòng
4 NonTeachingStaff Krishna

Kết quả của TeachingStaff bảng được hiển thị như sau:

Sid Trình độ chuyên môn Chủ đề
1 MSC MED Toán học
2 GIƯỜNG BSC Tiếng Anh

Trong bảng bên trên sid là khóa ngoại (bảng nhân viên biểu mẫu trường tham chiếu) Kết quả của NonTeachingStaff bảng được hiển thị như sau:

Sid Areaexpertise
3 Tài khoản
4 Quản trị viên văn phòng

Cuối cùng, ba bảng được tạo bằng cách sử dụng các trường tương ứng của chúng và trường SID được chia sẻ bởi cả ba bảng. Trong bảng Nhân viên, SID là khóa chính. Trong hai bảng còn lại (TeachingStaff và NonTeachingStaff), SID là khóa ngoại.

Chiến lược bảng mỗi lớp

Chiến lược bảng trên mỗi lớp là tạo một bảng cho mỗi thực thể con. Bảng Nhân viên sẽ được tạo, nhưng nó sẽ chứa các giá trị rỗng. Các giá trị trường của bảng Nhân viên phải được chia sẻ bởi cả hai bảng TeachingStaff và NonTeachingStaff.

Chúng ta hãy xem xét ví dụ tương tự như trên.

Tạo thực thể

Tạo một gói có tên ‘com.tutorialspoint.eclipselink.entity’ Dưới ‘src’gói hàng. Tạo một lớp java mới có tênStaff.javatheo gói nhất định. Lớp thực thể Nhân viên được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )
public class Staff implements Serializable 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int sid;
	private String sname;
	public Staff( int sid, String sname ) 
	{
		super( );
		this.sid = sid;
		this.sname = sname;
	}
	public Staff( ) 
	{
		super( );
	}
	public int getSid( ) 
	{
		return sid;
	}
	public void setSid( int sid ) 
	{
		this.sid = sid;
	}
	public String getSname( ) 
	{
		return sname;
	}
	public void setSname( String sname ) 
	{
		this.sname = sname;
	}
}

Tạo một lớp con (lớp) cho lớp Nhân viên có tên TeachingStaff.java phía dưới cái com.tutorialspoint.eclipselink.entitygói hàng. Lớp Thực thể TeachingStaff được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
public class TeachingStaff extends Staff 
{
	private String qualification;
	private String subjectexpertise;
	
	public TeachingStaff( int sid, String sname, 
			String qualification,String subjectexpertise ) 
	{
		super( sid, sname );
		this.qualification = qualification;
		this.subjectexpertise = subjectexpertise;
	}
	
	public TeachingStaff( ) 
	{
		super( );
		
	}

	public String getQualification( )
	{
		return qualification;
	}
	public void setQualification( String qualification )
	{
		this.qualification = qualification;
	}

	public String getSubjectexpertise( ) 
	{
		return subjectexpertise;
	}

	public void setSubjectexpertise( String subjectexpertise )
	{
		this.subjectexpertise = subjectexpertise;
	}
}

Tạo một lớp con (lớp) cho lớp Nhân viên có tên NonTeachingStaff.java phía dưới cái com.tutorialspoint.eclipselink.entitygói hàng. Lớp Thực thể NonTeachingStaff được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
public class NonTeachingStaff extends Staff 
{
	private String areaexpertise;

	public NonTeachingStaff( int sid, String sname, 
			String areaexpertise )
			{
		super( sid, sname );
		this.areaexpertise = areaexpertise;
	}

	public NonTeachingStaff( ) 
	{
		super( );
	}

	public String getAreaexpertise( ) 
	{
		return areaexpertise;
	}

	public void setAreaexpertise( String areaexpertise )
	{
		this.areaexpertise = areaexpertise;
	}
}

Persistence.xml

Tệp Persistence.xml chứa thông tin cấu hình của cơ sở dữ liệu và thông tin đăng ký của các lớp thực thể. Tệp xml được hiển thị như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Staff</class>
	<class>com.tutorialspoint.eclipselink.entity.NonTeachingStaff</class>
	<class>com.tutorialspoint.eclipselink.entity.TeachingStaff</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
                            value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
                            value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
                            value="create-tables"/>
			</properties>
	</persistence-unit>
</persistence>

Hạng dịch vụ

Các lớp dịch vụ là phần thực hiện của thành phần nghiệp vụ. Tạo một gói dưới‘src’ gói có tên ‘com.tutorialspoint.eclipselink.service’.

Tạo một lớp có tên SaveClient.javatrong gói đã cho để lưu trữ các trường lớp Staff, TeachingStaff và NonTeachingStaff. Lớp SaveClient được hiển thị như sau:

package com.tutorialspoint.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.NonTeachingStaff;
import com.tutorialspoint.eclipselink.entity.TeachingStaff;
public class SaveClient 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Teaching staff entity 
		TeachingStaff ts1=new TeachingStaff(
				1,"Gopal","MSc MEd","Maths");
		TeachingStaff ts2=new TeachingStaff(
				2, "Manisha", "BSc BEd", "English");
		//Non-Teaching Staff entity
		NonTeachingStaff nts1=new NonTeachingStaff(
				3, "Satish", "Accounts");
		NonTeachingStaff nts2=new NonTeachingStaff(
				4, "Krishna", "Office Admin");
		
		//storing all entities
		entitymanager.persist(ts1);
		entitymanager.persist(ts2);
		entitymanager.persist(nts1);
		entitymanager.persist(nts2);
		
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được thông báo trên bảng điều khiển của Eclipse IDE. Đối với đầu ra, hãy kiểm tra bàn làm việc MySQL.

Tại đây, ba bảng được tạo và Staff bảng chứa bản ghi null.

Kết quả của TeachingStaff được hiển thị như sau:

Sid Trình độ chuyên môn Tên của Chủ đề
1 MSC MED Gopal Toán học
2 GIƯỜNG BSC Manisha Tiếng Anh

Bảng trên đây TeachingStaff chứa các trường của cả Thực thể Nhân viên và Giảng viên.

Kết quả của NonTeachingStaff được hiển thị như sau:

Sid Areaexpertise Tên của
3 Tài khoản Hài lòng
4 Quản trị viên văn phòng Krishna

Bảng trên NonTeachingStaff chứa các trường của cả Thực thể Staff và NonTeachingStaff.

Chương này sẽ đưa bạn qua các mối quan hệ giữa các Thực thể. Nói chung các mối quan hệ hiệu quả hơn giữa các bảng trong cơ sở dữ liệu. Ở đây, các lớp thực thể được coi là bảng quan hệ (khái niệm của JPA), do đó mối quan hệ giữa các lớp Thực thể như sau:

  • @ManyToOne Relation
  • @OneToMany Relation
  • @OneToOne Relation
  • @ManyToMany Relation

@ManyToOne Relation

Mối quan hệ Nhiều-Một giữa các thực thể tồn tại trong đó một thực thể (cột hoặc tập hợp các cột) được tham chiếu với một thực thể khác (cột hoặc tập hợp các cột) chứa các giá trị duy nhất. Trong cơ sở dữ liệu quan hệ, các quan hệ này được áp dụng bằng cách sử dụng khóa ngoại / khóa chính giữa các bảng.

Chúng ta hãy xem xét một ví dụ về mối quan hệ giữa các thực thể Nhân viên và Bộ phận. Theo cách thức đơn hướng, tức là từ Nhân viên đến Bộ phận, mối quan hệ Nhiều-Một có thể áp dụng. Điều đó có nghĩa là mỗi bản ghi của nhân viên chứa một id phòng ban, id này phải là khóa chính trong bảng Department. Ở đây trong bảng Nhân viên, id Phòng ban là Khóa ngoại.

Sơ đồ sau đây cho thấy mối quan hệ Nhiều-Một giữa hai bảng.

Tạo một dự án JPA trong IDE eclipse có tên JPA_Eclipselink_MTO. Tất cả các mô-đun của dự án này được thảo luận dưới đây.

Tạo thực thể

Làm theo sơ đồ đã cho ở trên để tạo các thực thể. Tạo một gói có tên‘com.tutorialspoin.eclipselink.entity’ Dưới ‘src’gói hàng. Tạo một lớp có tênDepartment.javatheo gói nhất định. Thực thể Bộ phận lớp được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Department 
{
    @Id 
    @GeneratedValue( strategy=GenerationType.AUTO )
    private int id;
    private String name;

    public int getId() 
    {
    	return id;
    }
    
    public void setId(int id) 
    {
    	this.id = id;
    }
    
    public String getName( )
    {
    	return name;
    }
    
    public void setName( String deptName )
    {
    	this.name = deptName;
    }
}

Tạo thực thể thứ hai trong mối quan hệ này - Lớp thực thể nhân viên có tên Employee.java Dưới ‘com.tutorialspoint.eclipselink.entity’gói hàng. Lớp thực thể Nhân viên được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Employee 
{
	@Id
	@GeneratedValue( strategy= GenerationType.AUTO ) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	@ManyToOne
	private Department department;
	
	public Employee(int eid, 
			String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
		
	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}
}

Persistence.xml

Tệp Persistence.xml được yêu cầu để cấu hình cơ sở dữ liệu và đăng ký các lớp thực thể.

Persitence.xml sẽ được tạo bởi IDE eclipse trong khi tạo Dự án JPA. Các chi tiết cấu hình là thông số kỹ thuật của người dùng. Tệp Persence.xml được hiển thị như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 
             xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<class>com.tutorialspoint.eclipselink.entity.Department</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password"
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Các lớp dịch vụ

Mô-đun này chứa các lớp dịch vụ, thực hiện phần quan hệ bằng cách sử dụng phần khởi tạo thuộc tính. Tạo một gói dưới‘src’ gói có tên ‘com.tutorialspoint.eclipselink.service’. Lớp DAO có tênManyToOne.javađược tạo theo gói nhất định. Lớp DAO được hiển thị như sau:

package com.tutorialspointeclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Department;
import com.tutorialspoint.eclipselink.entity.Employee;

public class ManyToOne 
{
	public static void main( String[ ] args ) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Create Department Entity
		Department department = new Department();
		department.setName("Development");
		//Store Department
		entitymanager.persist(department);
		
		//Create Employee1 Entity
		Employee employee1 = new Employee();
		employee1.setEname("Satish");
		employee1.setSalary(45000.0);
		employee1.setDeg("Technical Writer");
		employee1.setDepartment(department);

		//Create Employee2 Entity
		Employee employee2 = new Employee();
		employee2.setEname("Krishna");
		employee2.setSalary(45000.0);
		employee2.setDeg("Technical Writer");
		employee2.setDepartment(department);

		//Create Employee3 Entity
		Employee employee3 = new Employee();
		employee3.setEname("Masthanvali");
		employee3.setSalary(50000.0);
		employee3.setDeg("Technical Writer");
		employee3.setDepartment(department);
		
		//Store Employees
		entitymanager.persist(employee1);
		entitymanager.persist(employee2);
		entitymanager.persist(employee3);
				
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được thông báo trên bảng điều khiển của Eclipse IDE. Đối với đầu ra, hãy kiểm tra bàn làm việc MySQL. Trong ví dụ này, hai bảng được tạo.

Chuyển truy vấn sau trong giao diện MySQL và kết quả là Department bảng sẽ được hiển thị như sau:

Select * from department
TÔI Tên
101 Phát triển

Chuyển truy vấn sau trong giao diện MySQL và kết quả là Employee bảng sẽ được hiển thị như sau.

Select * from employee
Eid Độ Tên Tiền lương Department_Id
102 Người viết kỹ thuật Hài lòng 45000 101
103 Người viết kỹ thuật Krishna 45000 101
104 Người viết kỹ thuật Masthanwali 50000 101

Trong bảng trên Deparment_Id là khóa ngoại (trường tham chiếu) từ bảng Department.

@OneToMany Relation

Trong mối quan hệ này, mỗi hàng của một thực thể được tham chiếu đến nhiều bản ghi con trong thực thể khác. Điều quan trọng là hồ sơ con không được có nhiều cha mẹ. Trong mối quan hệ một-nhiều giữa Bảng A và Bảng B, mỗi hàng trong Bảng A có thể được liên kết với một hoặc nhiều hàng trong Bảng B.

Chúng ta hãy xem xét ví dụ trên. Giả sử các bảng Nhân viên và Phòng ban trong ví dụ trên được kết nối theo cách một chiều ngược lại, khi đó quan hệ trở thành quan hệ Một-Nhiều. Tạo một dự án JPA trong IDE eclipse có tênJPA_Eclipselink_OTM. Tất cả các mô-đun của dự án này được thảo luận dưới đây.

Tạo thực thể

Làm theo sơ đồ đã cho ở trên để tạo các thực thể. Tạo một gói có tên‘com.tutorialspoin.eclipselink.entity’ Dưới ‘src’gói hàng. Tạo một lớp có tênDepartment.javatheo gói nhất định. Thực thể Bộ phận lớp được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Department 
{
    @Id 
    @GeneratedValue( strategy=GenerationType.AUTO )
    private int id;
    private String name;
    
    @OneToMany( targetEntity=Employee.class )
    private List employeelist;

    public int getId() 
    {
    	return id;
    }
    
    public void setId(int id) 
    {
    	this.id = id;
    }
    
    public String getName( )
    {
    	return name;
    }
    
    public void setName( String deptName )
    {
    	this.name = deptName;
    }

    public List getEmployeelist() 
    {
	return employeelist;
    }

    public void setEmployeelist(List employeelist) 
    {
	this.employeelist = employeelist;
    }
}

Tạo thực thể thứ hai trong mối quan hệ này -Lớp thực thể nhân viên, có tên Employee.java Dưới ‘com.tutorialspoint.eclipselink.entity’gói hàng. Lớp thực thể Nhân viên được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee 
{
	@Id
	@GeneratedValue( strategy= GenerationType.AUTO ) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
		
	public Employee(int eid, 
			String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}	
}

Persistence.xml

Tệp Persence.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 
             xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<class>com.tutorialspoint.eclipselink.entity.Department</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Các lớp dịch vụ

Mô-đun này chứa các lớp dịch vụ, thực hiện phần quan hệ bằng cách sử dụng phần khởi tạo thuộc tính. Tạo một gói dưới‘src’ gói có tên ‘com.tutorialspoint.eclipselink.service’. Lớp DAO có tênOneToMany.javađược tạo theo gói nhất định. Lớp DAO được hiển thị như sau:

package com.tutorialspointeclipselink.service;

import java.util.List;
import java.util.ArrayList;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Department;
import com.tutorialspoint.eclipselink.entity.Employee;

public class OneToMany 
{
	public static void main(String[] args) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Create Employee1 Entity
		Employee employee1 = new Employee();
		employee1.setEname("Satish");
		employee1.setSalary(45000.0);
		employee1.setDeg("Technical Writer");
								
		//Create Employee2 Entity
		Employee employee2 = new Employee();
		employee2.setEname("Krishna");
		employee2.setSalary(45000.0);
		employee2.setDeg("Technical Writer");
								
		//Create Employee3 Entity
		Employee employee3 = new Employee();
		employee3.setEname("Masthanvali");
		employee3.setSalary(50000.0);
		employee3.setDeg("Technical Writer");
		
		//Store Employee
		entitymanager.persist(employee1);
		entitymanager.persist(employee2);
		entitymanager.persist(employee3);
		
		//Create Employeelist
		List<Employee> emplist = new ArrayList();
		emplist.add(employee1);
		emplist.add(employee2);
		emplist.add(employee3);
		
		//Create Department Entity
		Department department= new Department();
		department.setName("Development");
		department.setEmployeelist(emplist);
				
		//Store Department
		entitymanager.persist(department);
		
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

Sau khi biên dịch và thực thi chương trình trên, bạn sẽ nhận được thông báo trong bảng điều khiển của Eclipse IDE. Để kiểm tra đầu ra MySQL workbench như sau.

Trong dự án này, ba bảng được tạo. Vượt qua truy vấn sau trong giao diện MySQL và kết quả của bảng Department_employee sẽ được hiển thị như sau:

Select * from department_Id;
Department_ID Employee_Eid
254 251
254 252
254 253

Trong bảng trên, deparment_idemployee_id là các khóa ngoại (trường tham chiếu) từ các bảng phòng ban và nhân viên.

Vượt qua truy vấn sau trong giao diện MySQL và kết quả của bảng phòng ban sẽ được hiển thị dưới dạng bảng như sau.

Select * from department;
TÔI Tên
254 Phát triển

Vượt qua truy vấn sau trong giao diện MySQL và kết quả của bảng nhân viên sẽ được hiển thị như sau:

Select * from employee;
Eid Độ Tên Tiền lương
251 Người viết kỹ thuật Hài lòng 45000
252 Người viết kỹ thuật Krishna 45000
253 Người viết kỹ thuật Masthanwali 50000

@OneToOne Relation

Trong mối quan hệ Một-Một, một mục chỉ có thể được liên kết với một mục khác. Nó có nghĩa là mỗi hàng của một thực thể được tham chiếu đến một và chỉ một hàng của thực thể khác.

Chúng ta hãy xem xét ví dụ trên. EmployeeDepartmenttheo cách đơn hướng ngược lại, quan hệ là quan hệ Một-Một. Nó có nghĩa là mỗi nhân viên chỉ thuộc về một bộ phận. Tạo một dự án JPA trong IDE eclipse có tênJPA_Eclipselink_OTO. Tất cả các mô-đun của dự án này được thảo luận dưới đây.

Tạo thực thể

Làm theo sơ đồ đã cho ở trên để tạo các thực thể. Tạo một gói có tên‘com.tutorialspoin.eclipselink.entity’ Dưới ‘src’gói hàng. Tạo một lớp có tênDepartment.javatheo gói nhất định. Thực thể Bộ phận lớp được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Department 
{
    @Id 
    @GeneratedValue( strategy=GenerationType.AUTO )
    private int id;
    private String name;
   
    public int getId() 
    {
    	return id;
    }
    
    public void setId(int id) 
    {
    	this.id = id;
    }
    
    public String getName( )
    {
    	return name;
    }
    
    public void setName( String deptName )
    {
    	this.name = deptName;
    }
}

Tạo thực thể thứ hai trong mối quan hệ này -Lớp thực thể nhân viên, có tên Employee.java Dưới ‘com.tutorialspoint.eclipselink.entity’gói hàng. Lớp thực thể Nhân viên được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToOne;

@Entity
public class Employee 
{
	@Id
	@GeneratedValue( strategy= GenerationType.AUTO ) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	
	@OneToOne
	private Department department;
		
	public Employee(int eid, 
			String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}

	public Department getDepartment() 
	{
		return department;
	}

	public void setDepartment(Department department) 
	{
		this.department = department;
	}	
}

Persistence.xml

Tệp Persistence.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 
             xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<class>com.tutorialspoint.eclipselink.entity.Department</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Các lớp dịch vụ

Tạo một gói dưới ‘src’ gói có tên ‘com.tutorialspoint.eclipselink.service’. Lớp DAO có tênOneToOne.javađược tạo theo gói đã cho. Lớp DAO được hiển thị như sau:

package com.tutorialspointeclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Department;
import com.tutorialspoint.eclipselink.entity.Employee;

public class OneToOne 
{
	public static void main(String[] args) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Create Department Entity
		Department department = new Department();
		department.setName("Development");
		
		//Store Department
		entitymanager.persist(department);
		
		//Create Employee Entity
		Employee employee = new Employee();
		employee.setEname("Satish");
		employee.setSalary(45000.0);
		employee.setDeg("Technical Writer");
		employee.setDepartment(department);
		
		//Store Employee
		entitymanager.persist(employee);
		
		entitymanager.getTransaction().commit();
		entitymanager.close();
		emfactory.close();
	}
}

Sau khi biên dịch và thực thi chương trình trên, bạn sẽ nhận được thông báo trong bảng điều khiển của Eclipse IDE. Đối với đầu ra, hãy kiểm tra MySQL workbench như sau.

Trong ví dụ trên, hai bảng được tạo. Vượt qua truy vấn sau trong giao diện MySQL và kết quả của bảng bộ phận sẽ được hiển thị như sau:

Select * from department
TÔI Tên
301 Phát triển

Chuyển truy vấn sau trong giao diện MySQL và kết quả là employee bảng sẽ được hiển thị như sau:

Select * from employee
Eid Độ Tên Tiền lương Department_id
302 Người viết kỹ thuật Hài lòng 45000 301

@ManyToMany Relation

Mối quan hệ Nhiều-Nhiều là nơi một hoặc nhiều hàng từ một thực thể được liên kết với nhiều hàng trong thực thể khác.

Chúng ta hãy xem xét một ví dụ về mối quan hệ giữa hai thực thể: ClassTeacher. Theo cách hai chiều, cả Lớp và Giáo viên đều có mối quan hệ Nhiều người với Một. Điều đó có nghĩa là mỗi bản ghi của Lớp học được tham chiếu bởi tập hợp Giáo viên (id giáo viên), các khóa này phải là khóa chính trong bảng Giáo viên và được lưu trữ trong bảng Giáo viên_ Lớp học và ngược lại. Ở đây, bảng Teacher_Class chứa cả các trường khóa ngoại. Tạo một dự án JPA trong IDE eclipse có tênJPA_Eclipselink_MTM. Tất cả các mô-đun của dự án này được thảo luận dưới đây.

Tạo thực thể

Tạo các thực thể bằng cách làm theo giản đồ được hiển thị trong sơ đồ trên. Tạo một gói có tên‘com.tutorialspoin.eclipselink.entity’ Dưới ‘src’gói hàng. Tạo một lớp có tênClas.javatheo gói nhất định. Thực thể Bộ phận lớp được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Clas 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int cid;
	private String cname;
	
	@ManyToMany(targetEntity=Teacher.class)
	private Set teacherSet;
	
	public Clas() 
	{
		super();
	}
	public Clas(int cid, 
			String cname, Set teacherSet) 
	{
		super();
		this.cid = cid;
		this.cname = cname;
		this.teacherSet = teacherSet;
	}
	public int getCid() 
	{
		return cid;
	}
	public void setCid(int cid) 
	{
		this.cid = cid;
	}
	public String getCname() 
	{
		return cname;
	}
	public void setCname(String cname) 
	{
		this.cname = cname;
	}
	public Set getTeacherSet() 
	{
		return teacherSet;
	}
	public void setTeacherSet(Set teacherSet) 
	{
		this.teacherSet = teacherSet;
	}	  
}

Tạo thực thể thứ hai trong mối quan hệ này -Lớp thực thể nhân viên, có tên Teacher.java Dưới ‘com.tutorialspoint.eclipselink.entity’gói hàng. Lớp thực thể Nhân viên được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import java.util.Set;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

@Entity
public class Teacher 
{
	@Id
	@GeneratedValue( strategy = GenerationType.AUTO )
	private int tid;
	private String tname;
	private String subject;
	
	@ManyToMany(targetEntity=Clas.class)
	private Set clasSet;
	
	public Teacher() 
	{
		super();
	}
	public Teacher(int tid, String tname, String subject, 
			Set clasSet) 
	{
		super();
		this.tid = tid;
		this.tname = tname;
		this.subject = subject;
		this.clasSet = clasSet;
	}
	public int getTid() 
	{
		return tid;
	}
	public void setTid(int tid) 
	{
		this.tid = tid;
	}
	public String getTname() 
	{
		return tname;
	}
	public void setTname(String tname) 
	{
		this.tname = tname;
	}
	public String getSubject() 
	{
		return subject;
	}
	public void setSubject(String subject) 
	{
		this.subject = subject;
	}
	public Set getClasSet() 
	{
		return clasSet;
	}
	public void setClasSet(Set clasSet) 
	{
		this.clasSet = clasSet;
	}
}

Persistence.xml

Tệp Persistence.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 
             xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
	<class>com.tutorialspoint.eclipselink.entity.Department</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
                            value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Các lớp dịch vụ

Tạo một gói dưới ‘src’ gói có tên ‘com.tutorialspoint.eclipselink.service’. Lớp DAO có tênManyToMany.javađược tạo theo gói nhất định. Lớp DAO được hiển thị như sau:

package com.tutorialspoint.eclipselink.service;

import java.util.HashSet;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.tutorialspoint.eclipselink.entity.Clas;
import com.tutorialspoint.eclipselink.entity.Teacher;

public class ManyToMany 
{
	public static void main(String[] args) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		entitymanager.getTransaction( ).begin( );
		
		//Create Clas Entity
		Clas clas1=new Clas(0,"1st",null);
		Clas clas2=new Clas(0,"2nd",null);
		Clas clas3=new Clas(0,"3rd",null);
		
		//Store Clas
		entitymanager.persist(clas1);
		entitymanager.persist(clas2);
		entitymanager.persist(clas3);
		
		//Create Clas Set1
		Set<Clas> classSet1 = new HashSet();
		classSet1.add(clas1);
		classSet1.add(clas2);
		classSet1.add(clas3);
		
		//Create Clas Set2
		Set<Clas> classSet2 = new HashSet();
		classSet2.add(clas3);
		classSet2.add(clas1);
		classSet2.add(clas2);
				
		//Create Clas Set3
		Set<Clas> classSet3 = new HashSet();
		classSet3.add(clas2);
		classSet3.add(clas3);
		classSet3.add(clas1);
		
		//Create Teacher Entity
		Teacher teacher1 = new Teacher(0,
				"Satish","Java",classSet1);
		Teacher teacher2 = new Teacher(0,
				"Krishna","Adv Java",classSet2);
		Teacher teacher3 = new Teacher(0,
				"Masthanvali","DB2",classSet3);
		
		//Store Teacher
		entitymanager.persist(teacher1);
		entitymanager.persist(teacher2);
		entitymanager.persist(teacher3);
		
		entitymanager.getTransaction( ).commit( );
		entitymanager.close( );
		emfactory.close( );
	}
}

Trong dự án ví dụ này, ba bảng được tạo. Chuyển truy vấn sau vào giao diện MySQL và kết quả của bảng teacher_clas sẽ được hiển thị như sau:

Select * form teacher_clas
Teacher_tid Classet_cid
354 351
355 351
356 351
354 352
355 352
356 352
354 353
355 353
356 353

Trong bảng trên teacher_tid là khóa ngoại từ bảng giáo viên và classet_cidlà khóa ngoại từ bảng lớp. Do đó, các giáo viên khác nhau được phân bổ cho các lớp khác nhau.

Vượt qua truy vấn sau trong giao diện MySQL và kết quả của bảng giáo viên sẽ được hiển thị như sau:

Select * from teacher
Tid Môn học Tên
354 Java Hài lòng
355 Adv Java Krishna
356 DB2 Masthanvali

Chuyển truy vấn sau trong giao diện MySQL và kết quả là clas bảng sẽ được hiển thị như sau:

Select * from clas
Cid Cname
351 Ngày 1
352 lần 2
353 lần thứ 3

Criteria là một API được xác định trước được sử dụng để xác định các truy vấn cho các thực thể. Đây là một cách thay thế để xác định truy vấn JPQL. Các truy vấn này là loại an toàn, di động và dễ sửa đổi bằng cách thay đổi cú pháp. Tương tự như JPQL, nó tuân theo một lược đồ trừu tượng (lược đồ dễ chỉnh sửa) và các đối tượng nhúng. API siêu dữ liệu được kết hợp với API tiêu chí để tạo mô hình thực thể liên tục cho các truy vấn tiêu chí.

Ưu điểm chính của API Criteria là các lỗi có thể được phát hiện sớm hơn trong thời gian biên dịch. Truy vấn JPQL dựa trên chuỗi và truy vấn dựa trên tiêu chí JPA giống nhau về hiệu suất và hiệu quả.

Lịch sử của API tiêu chí

Các tiêu chí được bao gồm trong tất cả các phiên bản của JPA do đó mỗi bước của tiêu chí được thông báo trong các thông số kỹ thuật của JPA.

  • Trong JPA 2.0, API truy vấn tiêu chí, tiêu chuẩn hóa các truy vấn được phát triển.
  • Trong JPA 2.1, cập nhật và xóa tiêu chí (cập nhật và xóa hàng loạt) được bao gồm.

Cấu trúc truy vấn tiêu chí

Criteria và JPQL có liên quan chặt chẽ với nhau và được phép thiết kế bằng cách sử dụng các toán tử tương tự trong các truy vấn của họ. Nó theo saujavax.persistence.criteriagói để thiết kế một truy vấn. Cấu trúc truy vấn có nghĩa là truy vấn tiêu chí cú pháp.

Truy vấn tiêu chí đơn giản sau đây trả về tất cả các phiên bản của lớp thực thể trong nguồn dữ liệu.

EntityManager em = ...;
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Entity class> cq = cb.createQuery(Entity.class);
Root<Entity> from = cq.from(Entity.class);
cq.select(Entity);
TypedQuery<Entity> q = em.createQuery(cq);
List<Entity> allitems = q.getResultList();

Truy vấn trình bày các bước cơ bản để tạo tiêu chí.

  • EntityManager instance được sử dụng để tạo một đối tượng CriteriaBuilder.

  • CriteriaQuerythể hiện được sử dụng để tạo một đối tượng truy vấn. Các thuộc tính của đối tượng truy vấn này sẽ được sửa đổi với các chi tiết của truy vấn.

  • CriteriaQuery.form phương thức được gọi để đặt gốc truy vấn.

  • CriteriaQuery.select được gọi để thiết lập kiểu danh sách kết quả.

  • TypedQuery<T> thể hiện được sử dụng để chuẩn bị một truy vấn để thực thi và chỉ định loại kết quả truy vấn.

  • getResultListtrên đối tượng TypedQuery <T> để thực thi một truy vấn. Truy vấn này trả về một tập hợp các thực thể, kết quả được lưu trữ trong một Danh sách.

Ví dụ về API tiêu chí

Chúng ta hãy xem xét ví dụ về cơ sở dữ liệu nhân viên. Giả sử bảng jpadb.employee chứa các bản ghi sau:

Eid	 Ename          Salary	Deg
401	 Gopal	        40000	Technical Manager
402	 Manisha	    40000	Proof reader
403	 Masthanvali    35000	Technical Writer
404  Satish	        30000	Technical writer
405	 Krishna	    30000	Technical Writer
406	 Kiran	        35000	Proof reader

Tạo một Dự án JPA trong IDE nhật thực có tên JPA_Eclipselink_Criteria. Tất cả các mô-đun của dự án này được thảo luận dưới đây:

Tạo thực thể

Tạo một gói có tên com.tutorialspoint.eclipselink.entity Dưới ‘src’

Tạo một lớp có tên Employee.javatheo gói nhất định. Thực thể nhân viên của lớp được hiển thị như sau:

package com.tutorialspoint.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee 
{
	@Id
	@GeneratedValue(strategy= GenerationType.AUTO) 	
	private int eid;
	private String ename;
	private double salary;
	private String deg;
	public Employee(int eid, String ename, double salary, String deg) 
	{
		super( );
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}
	
	public Employee( ) 
	{
		super();
	}
	
	public int getEid( ) 
	{
		return eid;
	}
	public void setEid(int eid)  
	{
		this.eid = eid;
	}
	
	public String getEname( ) 
	{
		return ename;
	}
	public void setEname(String ename) 
	{
		this.ename = ename;
	}
	
	public double getSalary( ) 
	{
		return salary;
	}
	public void setSalary(double salary) 
	{
		this.salary = salary;
	}
	
	public String getDeg( ) 
	{
		return deg;
	}
	public void setDeg(String deg) 
	{
		this.deg = deg;
	}
	@Override
	public String toString() {
		return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
				+ salary + ", deg=" + deg + "]";
	}
}

Persistence.xml

Tệp Persistence.xml như sau:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
	<persistence-unit name="Eclipselink_JPA" 
                        transaction-type="RESOURCE_LOCAL">
	<class>com.tutorialspoint.eclipselink.entity.Employee</class>
		<properties>
			<property name="javax.persistence.jdbc.url" 
			          value="jdbc:mysql://localhost:3306/jpadb"/>
			<property name="javax.persistence.jdbc.user" value="root"/>
			<property name="javax.persistence.jdbc.password" 
			          value="root"/>
			<property name="javax.persistence.jdbc.driver" 
			          value="com.mysql.jdbc.Driver"/>
			<property name="eclipselink.logging.level" value="FINE"/>
			<property name="eclipselink.ddl-generation" 
			          value="create-tables"/>
		</properties>
	</persistence-unit>
</persistence>

Các lớp dịch vụ

Mô-đun này chứa các lớp dịch vụ, thực hiện phần truy vấn Tiêu chí bằng cách sử dụng khởi tạo API MetaData. Tạo một gói có tên‘com.tutorialspoint.eclipselink.service’. Lớp có tênCriteriaAPI.javađược tạo theo gói nhất định. Lớp DAO được hiển thị như sau:

package com.tutorialspoint.eclipselink.service;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import com.tutorialspoint.eclipselink.entity.Employee;

public class CriteriaApi 
{
	public static void main(String[] args) 
	{
		EntityManagerFactory emfactory = Persistence.
				createEntityManagerFactory( "Eclipselink_JPA" );
		EntityManager entitymanager = emfactory.
				createEntityManager( );
		CriteriaBuilder criteriaBuilder = entitymanager
				.getCriteriaBuilder();
		CriteriaQuery<Object> criteriaQuery = criteriaBuilder
				.createQuery();
		Root<Employee> from = criteriaQuery.from(Employee.class);
		
		//select all records
        System.out.println(“Select all records”);
		CriteriaQuery<Object> select =criteriaQuery.select(from);
		TypedQuery<Object> typedQuery = entitymanager
				.createQuery(select);
		List<Object> resultlist= typedQuery.getResultList();
		
		for(Object o:resultlist)
		{
			Employee e=(Employee)o;
			System.out.println("EID : "+e.getEid()
					+" Ename : "+e.getEname());
		}
		
		//Ordering the records 
        System.out.println(“Select all records by follow ordering”);
		CriteriaQuery<Object> select1 = criteriaQuery.select(from);
        select1.orderBy(criteriaBuilder.asc(from.get("ename")));
        TypedQuery<Object> typedQuery1 = entitymanager
        		.createQuery(select);
        List<Object> resultlist1= typedQuery1.getResultList();
		
		for(Object o:resultlist1)
		{
			Employee e=(Employee)o;
			System.out.println("EID : "+e.getEid()
					+" Ename : "+e.getEname());
		}
		
		entitymanager.close( );
		emfactory.close( );
	}
}

Sau khi biên dịch và thực hiện chương trình trên, bạn sẽ nhận được kết quả sau trong bảng điều khiển của Eclipse IDE.

Select All records
EID : 401 Ename : Gopal
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish
EID : 405 Ename : Krishna
EID : 406 Ename : Kiran
Select All records by follow Ordering
EID : 401 Ename : Gopal
EID : 406 Ename : Kiran
EID : 405 Ename : Krishna
EID : 402 Ename : Manisha
EID : 403 Ename : Masthanvali
EID : 404 Ename : Satish