Header Ads Widget

Responsive Advertisement

Nổi bật

6/recent/ticker-posts

Câu hỏi phỏng vấn Java - JPA, Spring Data JPA



1. What is JPA?
Ánh xạ quan hệ đối tượng (ORM) là quá trình chuyển đổi các đối tượng Java sang các bảng cơ sở dữ liệu. Nói cách khác, điều này cho phép chúng ta tương tác với cơ sở dữ liệu quan hệ mà không cần bất kỳ SQL nào. Java Persistence API (JPA) là một đặc tả xác định cách duy trì dữ liệu trong các ứng dụng Java.

2. What is Hibernate?
Hibernate là một trong những Java ORM Framework phổ biến nhất được sử dụng hiện nay. Bản phát hành đầu tiên của nó đã cách đây gần hai mươi năm, và vẫn có sự hỗ trợ cộng đồng tuyệt vời và các bản phát hành thường xuyên. Ngoài ra, Hibernate là một triển khai tiêu chuẩn của đặc tả JPA, với một vài tính năng bổ sung dành riêng cho Hibernate

3. How do you define an entity in JPA?

Các entity trong JPA không là gì ngoài các POJO đại diện cho dữ liệu có thể được duy trì trong cơ sở dữ liệu. Một Entity đại diện cho một bảng được lưu trữ trong cơ sở dữ liệu. Mỗi phiên bản của một thực thể đại diện cho một hàng trong bảng.

Chúng ta xác định nó bằng cách sử dụng chú thích @Entity. Tên thực thể mặc định là tên của lớp.

VD:

@Entity(name="student")
public class Student { // fields, getters and setters }

Các chú thích trong JPA

Chú thích

Sự miêu tả

@Entity

Chú thích này chỉ định khai báo lớp dưới dạng thực thể hoặc bảng.

@Table

Chú thích này chỉ định khai báo tên bảng.

@Basic

Chú thích này chỉ định các trường không ràng buộc một cách rõ ràng.

@Embedded

Chú thích này chỉ định các thuộc tính của lớp hoặc một thực thể có thể hiện giá trị của một lớp có thể nhúng.

@Id

Chú thích này 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ú thích này chỉ định, cách thuộc tính nhận dạng có thể được khởi tạo, chẳng hạn như Tự động, thủ công hoặc giá trị được lấy từ bảng trình tự.

@Transient

Chú thích này 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.

@Column

Chú thích này được sử dụng để chỉ định cột hoặc thuộc tính cho thuộc tính kiên trì.

@SequenceGenerator

Chú thích này được sử dụng để xác đị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ú thích này được sử dụng để 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ị.

@AccessType

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ì quyền truy cập thông thường của Trường sẽ xảy ra. Nếu bạn đặt @AccessType (THUỘC TÍNH) thì việc đánh giá Thuộc tính khôn ngoan sẽ xảy ra.

@JoinColumn

Chú thích này được sử dụng để 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 các mối quan hệ many-oneone-many.

@UniqueConstraint

Chú thích này được sử dụng để chỉ định trường, ràng buộc duy nhất cho bảng chính hoặc phụ.

@ColumnResult

Chú thích này tham chiếu đến tên của một cột trong truy vấn SQL bằng mệnh đề select.

@ManyToMany

Chú thích này được sử dụng để xác định mối quan hệ many-many giữa các Bảng nối.

@ManyToOne

Chú thích này được sử dụng để xác định mối quan hệ many-one giữa các Bảng nối.

@OneToMany

Chú thích này được sử dụng để xác định mối quan hệ one-many giữa các Bảng nối.

@OneToOne

Chú thích này được sử dụng để xác định mối quan hệ one-one giữa các Bảng nối.

@NamedQueries

Chú thích này được sử dụng để chỉ định danh sách các truy vấn được đặt tên.

@NamedQuery

Chú thích này được sử dụng để chỉ định một Truy vấn sử dụng tên tĩnh.

VD:
@Entity
    @Table(name="STUDENT")
    public class Student {
        @Id
         //giá tr có th là auto, table, sequence hoc identity
        @GeneratedValue(strategy=GenerationType.AUTO).
        private Long id;
        @Column(name=
"STUDENT_NAME", length=50, nullable=false, unique=false)         private String name;
        @Transient        
private Integer age;
        @Temporal(TemporalType.DATE)
// lưu các giá tr tm thi trong bng         private Date birthDate;
                    // đ ch đnh liu enum nên được duy trì theo tên hay theo th t
        @Enumerated(EnumType.STRING)
        private Gender gender;
// other fields, getters and setters }

4. What is an Entity Manager?
JPA EntityManager là cốt lõi của Java Persistence API. Hibernate là cách triển khai JPA được sử dụng rộng rãi nhất.

JPA EntityManager
👉  Một trong những khía cạnh quan trọng nhất của chương trình là kết nối với cơ sở dữ liệu. Kết nối cơ sở dữ liệu và giao dịch với cơ sở dữ liệu được coi là giao dịch tốn kém nhất. ORM là một công cụ rất quan trọng trong vấn đề này. ORM giúp biểu diễn các quan hệ của cơ sở dữ liệu dưới dạng các đối tượng java.
👉  ORM bao gồm hai khái niệm hướng đối tượng và lập trình quan hệ.
👉  Hibernate là một khung công tác ORM nơi người lập trình mô tả cách các đối tượng được biểu diễn trong cơ sở dữ liệu. Hibernate tự động xử lý chuyển đổi.
👉  Hibernate cung cấp việc triển khai các JPA interface EntityManagerFactoryEntityManager.
👉  EntityManagerFactory cung cấp các phiên bản của EntityManager để kết nối với cùng một cơ sở dữ liệu. Tất cả các phiên bản được định cấu hình để sử dụng cùng một cài đặt như được xác định bởi triển khai mặc định. Một số nhà máy quản lý thực thể có thể được chuẩn bị để kết nối với các kho dữ liệu khác nhau.
👉  JPA EntityManager được sử dụng để truy cập cơ sở dữ liệu trong một ứng dụng cụ thể. Nó được sử dụng để quản lý các cá thể thực thể liên tục, để tìm các thực thể theo danh tính khóa chính của chúng và để truy vấn trên tất cả các thực thể.


Phương thức JPA EntityManager
    JPA EntityManager được hỗ trợ bởi bộ phương pháp sau. Để dễ đọc hơn, tôi đã không đề cập đến các đối số phương pháp.
👉  persist - Tạo một phiên bản được quản lý và liên tục.
👉  merge - Hợp nhất trạng thái của thực thể đã cho vào ngữ cảnh tồn tại hiện tại.
👉  remove - Loại bỏ cá thể thực thể.
👉  find - Tìm theo khóa chính. Tìm kiếm một thực thể của lớp và khóa chính được chỉ định. Nếu cá thể thực thể được chứa trong ngữ cảnh tồn tại, nó sẽ được trả về từ đó.
👉  getReference - trả về và cá thể được tìm nạp một cách lười biếng và sẽ ném EntityNotFoundException khi cá thể được truy cập lần đầu tiên.
👉  flush - Đồng bộ hóa ngữ cảnh liên tục với cơ sở dữ liệu.
👉  setFlushMode - đặt chế độ xả cho tất cả các đối tượng của ngữ cảnh liên tục.
👉  getFlushMode - lấy chế độ xả cho tất cả các đối tượng của ngữ cảnh liên tục.
👉  lock - Khóa một cá thể thực thể được chứa trong ngữ cảnh tồn tại với kiểu chế độ khóa được chỉ định.
👉  refresh - nó làm mới trạng thái của cá thể từ cơ sở dữ liệu cũng như nó sẽ ghi đè các thay đổi đối với thực thể.
👉  clear - Xóa bối cảnh tồn tại, khiến tất cả các thực thể được quản lý trở nên tách rời. Các thay đổi được thực hiện đối với các thực thể chưa được chuyển vào cơ sở dữ liệu sẽ không được duy trì.
👉  detach - điều này tương tự như phương thức clear, chỉ bổ sung là thực thể mà trước đó đã tham chiếu đến đối tượng tách rời sẽ tiếp tục làm như vậy.
👉  contains - nó kiểm tra xem thực thể được quản lý có thuộc bối cảnh tồn tại hiện tại hay không.
👉  getLockMode - lấy chế độ khóa hiện tại cho thực thể.
👉  setProperty - đặt thuộc tính hoặc gợi ý của người quản lý thực thể.
👉  getProperties - lấy các thuộc tính và gợi ý được liên kết với trình quản lý thực thể.
👉  createQuery - Tạo một phiên bản của Query để thực thi một câu lệnh ngôn ngữ truy vấn Java Persistence.
👉  createNamedQuery - Tạo một phiên bản của Query để thực thi một câu lệnh ngôn ngữ truy vấn có tên là Java Persistence.
👉  createNativeQuery - Tạo một phiên bản của Query để thực thi một câu lệnh sql gốc.
👉  createNamedStoredProcedureQuery - Tạo một phiên bản của StoredProcedureQuery để thực thi một thủ tục được lưu trữ trong cơ sở dữ liệu.
👉  createStoredProcedureQuery - Tạo một phiên bản của StoredProcedureQuery để thực thi một thủ tục được lưu trữ trong cơ sở dữ liệu.
👉  joinTransaction - Cho người quản lý thực thể biết rằng một giao dịch JTA đang hoạt động. Phương thức này phải được gọi trên trình quản lý thực thể được quản lý ứng dụng JTA đã được tạo bên ngoài phạm vi của giao dịch đang hoạt động để liên kết nó với giao dịch JTA hiện tại.
👉  isJoinedToTransaction - nó xác định xem entityManager có được liên kết với giao dịch hiện tại hay không.
👉  Unrap - Trả lại một đối tượng thuộc loại được chỉ định để cho phép truy cập vào API dành riêng cho nhà cung cấp
👉  getDelegate - trả về đối tượng nhà cung cấp cho entityManager.
👉  close - đóng một entityManager do ứng dụng quản lý.
👉  isOpen - xác định xem entityManager có đang mở hay không.
👉  getTransaction - Trả về đối tượng EntityTransaction cấp tài nguyên.
👉  getEntityManagerFactory - cung cấp nhà máy quản lý thực thể cho người quản lý thực thể.
👉  getCriteriaBuilder - Trả về một thể hiện của CriteriaBuilder để tạo các đối tượng CriteriaQuery.
👉  getMetamodel - Trả về một phiên bản của giao diện Metamodel để truy cập vào siêu mô hình của đơn vị bền vững.
👉  createEntityGraph - Trả về một EntityGraph có thể thay đổi có thể được sử dụng để tạo động một EntityGraph.
👉  getEntityGraph - trả về một entityGraph có tên

5. What is a Persistence Context?
        Persently Context đại diện cho các thực thể chứa dữ liệu và đủ điều kiện để được duy trì trong một số lưu trữ liên tục như cơ sở dữ liệu. Khi chúng tôi thực hiện một giao dịch trong một phiên có các thực thể này được đính kèm, Hibernate sẽ xóa ngữ cảnh liên tục và các thay đổi (insert / save, update or delete) trên chúng vẫn được lưu giữ trong bộ nhớ liên tục.

6. How do you map relationships in JPA?
    Ánh xạ liên kết là một trong những tính năng chính của JPAHibernate. Chúng mô hình hóa mối quan hệ giữa hai bảng cơ sở dữ liệu dưới dạng các thuộc tính trong mô hình miền của bạn. Điều đó cho phép bạn dễ dàng điều hướng các liên kết trong mô hình miền của mình và các truy vấn JPQL hoặc Tiêu chí.

JPA và Hibernate hỗ trợ các liên kết giống như bạn biết từ mô hình cơ sở dữ liệu quan hệ của mình. Bạn có thể dùng:
Ánh xạ one-to-one
Ánh xạ many-to-one 
Ánh xạ many-to-many.


7. What are the different types of relationships in JPA?


8. How do you define One to One Mapping in JPA?
Đầu tiên, hãy tạo lớp User và chú thích nó một cách thích hợp:
@Entity
@Table(name =
"users")
public class User {
    @Id     @GeneratedValue(strategy = GenerationType.AUTO)     @Column(name =
"id")     private Long id;     //...
   
@OneToOne(cascade = CascadeType.ALL)     @JoinColumn(name = "address_id", referencedColumnName = "id")     private Address address; // ... getters and setters }
Lưu ý rằng chúng tôi đặt chú thích @OneToOne trên trường thực thể liên quan, Address.
Ngoài ra, chúng ta cần phải đặt các chú thích @JoinColumn  để cấu hình tên của cột trong User mà các bản đồ để khóa chính trong Address. Nếu chúng tôi không cung cấp tên, Hibernate sẽ tuân theo một số quy tắc để chọn một tên mặc định.
    Cuối cùng, hãy lưu ý trong thực thể tiếp theo rằng chúng tôi sẽ không sử dụng chú thích @JoinColumn ở đó. Điều này là do chúng tôi chỉ cần nó ở khía cạnh sở hữu của mối quan hệ khóa ngoài. Nói một cách đơn giản, bất kỳ bên nào sở hữu cột khóa ngoại sẽ nhận được chú thích @JoinColumn.
Thực thể Address hóa ra đơn giản hơn một chút:
@Entity
@Table(name =
"address")
public class Address {
    @Id     @GeneratedValue(strategy = GenerationType.AUTO)     @Column(name =
"id")     private Long id;     //...
   
@OneToOne(mappedBy = "address")     private User user; //... getters and setters
}
Chúng tôi cũng cần đặt chú thích @OneToOne ở đây. Đó là bởi vì đây là mối quan hệ hai chiều . Phía Address của mối quan hệ được gọi là phía không sở hữu.

9. How do you define One to Many Mapping in JPA?
    Ánh xạ One-to-Many thuộc loại liên kết có giá trị tập hợp trong đó một thực thể được liên kết với một tập hợp các thực thể khác. Do đó, trong kiểu liên kết này, cá thể của một thực thể có thể được ánh xạ với bất kỳ số lượng cá thể nào của thực thể khác.
VD

10. How do you define Many to Many Mapping in JPA?
        Dễ dàng lập mô hình mối quan hệ many-many với POJO. Chúng ta nên bao gồm một Collection trong cả hai lớp, trong đó chứa các phần tử của các lớp khác.
Sau đó, chúng ta cần đánh dấu lớp bằng @Entity và khóa chính bằng @Id để biến chúng thành các thực thể JPA thích hợp.
Ngoài ra, chúng ta nên cấu hình kiểu quan hệ. Vì vậy, chúng tôi đánh dấu các Collection bằng chú thích @ManyToMany:
@Entity
class Student {
   
@Id     Long id;
   
@ManyToMany     Set<Course> likedCourses;
// additional properties // standard constructors, getters, and setters }

@Entity class Course {
   
@Id     Long id;
   
@ManyToMany     Set<Student> likes;
// additional properties // standard constructors, getters, and setters
}
    Ngoài ra, chúng ta phải cấu hình cách lập mô hình mối quan hệ trong RDBMS.
Phía chủ sở hữu là nơi chúng tôi định cấu hình mối quan hệ. Chúng tôi sẽ sử dụng lớp Student.
Chúng tôi có thể làm điều này với chú thích @JoinTable trong lớp Student Chúng tôi cung cấp tên của bảng tham gia ( course_like ) cũng như các khóa ngoại có chú thích @JoinColumn. Các joinColumn thuộc tính sẽ kết nối với phía chủ sở hữu của mối quan hệ, và inverseJoinColumn sang phía bên kia:
@ManyToMany
@JoinTable
(         name = "course_like",         joinColumns = @JoinColumn(name = "student_id"),         inverseJoinColumns = @JoinColumn(name = "course_id")) Set<Course> likedCourses;
    Lưu ý rằng không cần sử dụng @JoinTable hoặc thậm chí @JoinColumn . JPA sẽ tạo tên bảng và cột cho chúng ta. Tuy nhiên, chiến lược mà JPA sử dụng không phải lúc nào cũng phù hợp với các quy ước đặt tên mà chúng tôi sử dụng. Vì vậy, chúng ta cần khả năng cấu hình tên bảng và cột.
Về phía mục tiêu, chúng tôi chỉ phải cung cấp tên của trường, bản đồ của mối quan hệ.
Do đó, chúng tôi đặt thuộc tính mappedBy của chú thích @ManyToMany trong lớp Courses:
@ManyToMany(mappedBy = "likedCourses")
Set<Student> likes;
Hãy nhớ rằng vì mối quan hệ many-many không có phía chủ sở hữu trong cơ sở dữ liệu, chúng tôi có thể định cấu hình bảng tham gia trong lớp Courses và tham chiếu nó từ lớp Student

11. What is the use of persistence.xml
Phần quan trọng nhất của việc sử dụng chế độ ngủ đông là cung cấp tệp Persistence.xml. Xml này chứa cấu hình để kết nối với cơ sở dữ liệu.

<persistence xmlns="https://xmlns.jcp.org/xml/ns/persistence"
          xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="https://xmlns.jcp.org/xml/ns/persistence
https://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"  version="2.1">
<
persistence-unit name="persistence">
   <
description>Hibernate Entity Manager Example</description>    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
   <
properties>
      <
property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />       <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/Test" />       <property name="javax.persistence.jdbc.user" value="journaldev" />       <property name="javax.persistence.jdbc.password" value="journaldev" />       <property name="hibernate.show_sql" value="true" />    </properties> </persistence-unit> </persistence>
hibernate.show_sql được sử dụng để ra lệnh cho hibernate in các truy vấn sql vào các tệp nhật ký hoặc bảng điều khiển.
Cấu hình quan trọng nhất là providerclass tức là
org.hibernate.jpa.HibernatePersistenceProvider. Đây là cách Hibernate được kết nối vào ứng dụng của chúng tôi để được sử dụng như việc triển khai JPA.
Có các thuộc tính để kết nối với cơ sở dữ liệu và trình điều khiển của bạn để sử dụng.
Điều quan trọng cần lưu ý là persistence.xml nên được đặt trong thư mục META-INF, như bạn có thể thấy từ hình ảnh dự án.

12. How do you configure Entity Manager Factory and Transaction Manager?

EntityManagerFactory
    Các interface EntityManagerFactory hiện diện trong gói java.persistence được sử dụng để cung cấp một trình quản lý thực thể.
1)
EntityManagerFactory emf = Persistence.createEntityManagerFactory ( "Student_details" );
👉 Persistence - Persistence là một lớp bootstrap được sử dụng để lấy giao diện EntityManagerFactory.
👉Phương thức createEntityManagerFactory() - Vai trò của phương thức này là tạo và trả về một EntityManagerFactory cho đơn vị tồn tại được đặt tên. Do đó, phương thức này chứa tên của đơn vị độ bền được truyền vào tệp Persistence.xml.

2) Có được một người quản lý thực thể từ nhà máy.
EntityManager em = emf.createEntityManager ();
👉EntityManager - EntityManager là một giao diện
👉Phương thức createEntityManager() - Nó tạo EntityManager do ứng dụng quản lý mới.

3)Làm quen với một người quản lý đơn vị.
em.getTransaction().begin();
👉Phương thức getTransaction() - Phương thức này trả về đối tượng EntityTransaction cấp tài nguyên.
👉Phương thức begin() - Phương thức này được sử dụng để bắt đầu giao dịch.

4) Cố định một dữ liệu vào cơ sở dữ liệu quan hệ.
em.persist(s1);
Kiên trì() - Phương thức này được sử dụng để tạo một thể hiện được quản lý và liên tục. Một cá thể thực thể được chuyển trong phương thức này.

5) Đóng giao dịch
em.getTransaction().commit();

6) Giải phóng các nguồn lực của nhà máy.

emf.close ();
em.close ();
close() - Phương thức này được sử dụng để giải phóng tài nguyên của nhà máy

Spring Data

1. What is Spring Data?

Spring Data JPA là một phần của họ Spring Data. Spring Data giúp dễ dàng hơn trong việc tạo các ứng dụng theo hướng Spring sử dụng các cách mới để truy cập dữ liệu, chẳng hạn như cơ sở dữ liệu không quan hệ, khung giảm thiểu bản đồ, dịch vụ đám mây, cũng như hỗ trợ cơ sở dữ liệu quan hệ nâng cao. Bài viết này sẽ thảo luận về Spring Data JPA. Chúng tôi cũng sẽ xem xét ứng dụng ví dụ Spring Data JPA.

Một số tính năng thú vị được cung cấp bởi Spring Data JPA là:
👉  Tạo và hỗ trợ các kho lưu trữ được tạo bằng SpringJPA
👉  Hỗ trợ các truy vấn QueryDSLJPA
👉  Kiểm tra các lớp miền
👉  Hỗ trợ tải hàng loạt, sắp xếp, truy vấn động
👉  Hỗ trợ ánh xạ XML cho các thực thể
👉  Giảm kích thước mã cho các hoạt động CRUD chung bằng cách sử dụng CrudRepository

2. What is the need for Spring Data?
        Tôi muốn nói rằng nếu bạn cần nhanh chóng tạo một lớp kho lưu trữ dựa trên JPA chủ yếu dành cho các hoạt động CRUD và bạn không muốn tạo DAO trừu tượng , thực hiện các interface, Spring Data JPA là một lựa chọn tốt.

3. What is a CrudRepository?
Bước tiếp theo là tạo kho lưu trữ JPA.

package com.journaldev.spring.repository;
import org.springframework.data.repository.CrudRepository; import com.journaldev.spring.model.Person; import java.util.List;
public interface PersonRepository<P> extends CrudRepository<Person, Long> {
List<Person> findByFirstName(String firstName); }
    Bằng cách kế thừa từ CrudRepository, chúng ta có thể gọi nhiều phương thức mà không cần phải tự mình triển khai chúng. Một số phương pháp này là:
👉  save
👉  findOne
👉  exists
👉  findAll
👉  count
👉  delete
👉  deleteAll
        Chúng tôi cũng có thể xác định các phương pháp của riêng mình. Các tên phương pháp này nên sử dụng các từ khóa đặc biệt như "tìm", "đặt hàng" cùng với tên của các biến. Các nhà phát triển Spring Data JPA đã cố gắng tính đến phần lớn các tùy chọn khả thi mà bạn có thể cần. Trong ví dụ của chúng tôi, phương thức findByFirstName(String firstName) trả về tất cả các mục nhập từ bảng trong đó trường first_name bằng firstName.

Đây là một trong những tính năng quan trọng nhất của Spring Data JPA vì nó giảm thiểu rất nhiều mã tấm lò hơi. Ngoài ra, khả năng xảy ra lỗi cũng ít hơn vì các phương pháp Spring này đã được kiểm tra tốt bởi nhiều dự án đã sử dụng chúng.



Bài viết được tổng hợp lại từ 1 số nguồn trên internet. Cảm ơn bạn đã xem bài viết!
Nếu có bất cứ lỗi sai nào trong bài bạn có thể góp ý cho chúng tôi bằng cách bình luận bên dưới.

Đăng nhận xét

0 Nhận xét