Ngân hàng câu hỏi của chương

Câu hỏi: HSF302 - Phần 1: JPA và ánh xạ đối tượng–quan hệ

40 câu trắc nghiệm kèm lời giải của môn HSF302 - Làm việc với Spring Framework, xếp theo thứ tự nhập vào ngân hàng. Trang 2/2 — câu 21–40.

Danh sách câu hỏi

40/40 câuHết danh sách
AThe table of the first entity.
BThe table of the second entity.
CA join table.
DA temporary table.
Lời giải
Đáp án đúng: "A join table.". Quan hệ nhiều nhiều không thể biểu diễn bằng một cột khoá ngoại ở bảng nào, vì mỗi dòng bên này ứng với nhiều dòng bên kia và ngược lại; JPA vì thế dùng một bảng nối (join table) chứa hai cột khoá ngoại trỏ tới khoá chính của hai entity, ví dụ bảng student_course gồm student_id và course_id, mô tả bằng @ManyToMany kèm @JoinTable với joinColumns và inverseJoinColumns. "The table of the first entity." không làm được vì một cột chỉ chứa một giá trị khoá ngoại, không lưu được nhiều liên kết cho cùng một dòng. "The table of the second entity." gặp đúng vấn đề đó theo chiều ngược lại. "A temporary table." chỉ tồn tại trong phiên làm việc hoặc giao dịch rồi biến mất, không giữ được quan hệ lâu dài.
Mở trang câu hỏi này →
ATo define a standard for web application development
BTo define a standard for object-relational mapping in Java
CTo manage user interfaces
DTo handle network communication
Lời giải
Đáp án đúng: "To define a standard for object-relational mapping in Java". Mục đích chính của JPA (Java Persistence API) là đưa ra một chuẩn chung cho ORM, tức ánh xạ đối tượng Java sang bảng quan hệ: đặc tả quy định annotation như @Entity, @Table, @Id, giao diện EntityManager, vòng đời thực thể và ngôn ngữ truy vấn JPQL, còn các nhà cung cấp như Hibernate hay EclipseLink hiện thực chuẩn đó, nên mã viết theo JPA có thể đổi nhà cung cấp mà ít phải sửa. "To define a standard for web application development" là phạm vi của Servlet, Jakarta EE web hay Spring MVC, không phải JPA. "To manage user interfaces" là việc của JavaFX, Swing hay tầng view. "To handle network communication" thuộc về socket, HTTP client hay RMI, không liên quan tới lưu trữ dữ liệu.
Mở trang câu hỏi này →
ATo generate UUIDs.
BTo generate primary keys using a sequence.
CTo generate primary keys using an auto-increment column.
DTo generate random numbers.
Lời giải
Đáp án đúng: "To generate primary keys using an auto-increment column.". GenerationType.IDENTITY giao việc sinh khoá chính cho cột identity hoặc auto-increment của cơ sở dữ liệu (AUTO_INCREMENT ở MySQL, IDENTITY ở SQL Server); provider phải chạy INSERT ngay để lấy khoá vừa sinh, nên Hibernate không gom lô các lệnh chèn được với chiến lược này. "To generate UUIDs." sai vì khoá UUID dùng GenerationType.UUID (có từ JPA 3.1) hoặc bộ sinh UUID riêng của Hibernate. "To generate primary keys using a sequence." mô tả GenerationType.SEQUENCE, dùng đối tượng sequence của cơ sở dữ liệu kèm @SequenceGenerator và cấp số trước khi INSERT. "To generate random numbers." sai vì không chiến lược sinh khoá nào của JPA tạo số ngẫu nhiên; IDENTITY tăng dần tuần tự.
Mở trang câu hỏi này →
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@ManyToMany". @ManyToMany trong JPA khai báo quan hệ nhiều nhiều, ví dụ một Student học nhiều Course và một Course có nhiều Student; phía sở hữu thường kèm @JoinTable mô tả bảng nối, phía còn lại dùng mappedBy trỏ về trường của phía sở hữu, và kiểu trường là một tập hợp như Set hoặc List. "@OneToOne" dành cho quan hệ một một, mỗi entity bên này ứng với đúng một entity bên kia. "@ManyToOne" đặt ở phía nhiều của quan hệ một nhiều, trường là một đối tượng đơn và cột khoá ngoại nằm trong bảng của chính entity đó. "@OneToMany" đặt ở phía một, trường là tập hợp nhưng mỗi phần tử con chỉ thuộc về một cha, nên không diễn tả được việc hai bên cùng có nhiều.
Mở trang câu hỏi này →
ATo specify a primary key
BTo mark a field as not persistent (not to be stored in the database)
CTo define a relationship between entities
DTo indicate a read-only field
Lời giải
Đáp án đúng: "To mark a field as not persistent (not to be stored in the database)". Theo JPA, mọi trường của thực thể mặc định đều được ánh xạ thành cột; đặt @Transient lên một trường báo persistence provider bỏ qua nó, không tạo cột, không đọc ghi, thường dùng cho giá trị tính toán như tuổi suy ra từ ngày sinh hay trường tạm chỉ dùng trong bộ nhớ. Cần phân biệt với từ khoá transient của Java vốn chủ yếu liên quan tuần tự hoá. "To specify a primary key" là việc của @Id. "To define a relationship between entities" là việc của @OneToMany, @ManyToOne, @ManyToMany hay @OneToOne. "To indicate a read-only field" sai vì trường @Transient hoàn toàn không gắn với cơ sở dữ liệu; muốn cột chỉ đọc thì dùng @Column với insertable và updatable bằng false, hoặc @Immutable của Hibernate cho cả thực thể.
Mở trang câu hỏi này →
A@Component
B@Service
C@Entity
D@Repository
Lời giải
Đáp án đúng: "@Entity". @Entity đánh dấu một lớp là thực thể JPA, tức lớp được ánh xạ tới một bảng; provider như Hibernate sẽ quản lý vòng đời các đối tượng thuộc lớp đó trong persistence context, và Spring Data JPA chỉ tạo repository cho các lớp đã là entity. "@Component" là stereotype chung đăng ký một lớp làm bean trong Spring container, không liên quan tới ánh xạ bảng. "@Service" là dạng chuyên biệt của @Component cho tầng nghiệp vụ, chỉ mang ý nghĩa vai trò. "@Repository" đánh dấu bean truy cập dữ liệu và bật dịch ngoại lệ sang DataAccessException; nó gắn lên lớp hoặc interface truy cập dữ liệu chứ không gắn lên lớp dữ liệu, và với interface kế thừa JpaRepository thì thậm chí không bắt buộc.
Mở trang câu hỏi này →
AEAGER
BLAZY
CDEPENDENT
DCASCADE
Lời giải
Đáp án đúng: "LAZY". Theo đặc tả JPA, kiểu nạp mặc định của @ManyToMany là FetchType.LAZY, cũng như @OneToMany: vì phía kia là một tập hợp có thể rất lớn, JPA chỉ đặt một proxy hay collection bao ngoài và chỉ truy vấn bảng nối khi mã thực sự duyệt tập hợp đó, nhờ vậy tránh nạp thừa dữ liệu. "EAGER" là mặc định của các quan hệ trỏ tới một đối tượng đơn là @ManyToOne và @OneToOne, ở @ManyToMany chỉ có khi khai báo tường minh fetch = FetchType.EAGER. "DEPENDENT" không phải giá trị nào của enum FetchType, vốn chỉ có LAZY và EAGER. "CASCADE" là khái niệm khác, quy định thao tác như persist hay remove có lan sang thực thể liên quan không, được khai báo qua thuộc tính cascade chứ không phải kiểu nạp.
Mở trang câu hỏi này →
AUser sessions
BEntity lifecycle and persistence
CNetwork connections
DWeb page rendering
Lời giải
Đáp án đúng: "Entity lifecycle and persistence". EntityManager là API trung tâm của JPA, gắn với một persistence context (ngữ cảnh lưu trữ): nó đưa thực thể qua các trạng thái new, managed, detached, removed bằng persist, merge, detach, remove, tìm thực thể bằng find, tạo truy vấn JPQL, và đồng bộ thay đổi xuống cơ sở dữ liệu khi flush hoặc commit nhờ dirty checking. "User sessions" là phiên HTTP do servlet container và HttpSession quản lý, không phải việc của tầng persistence. "Network connections" sai vì kết nối cơ sở dữ liệu do DataSource và connection pool như HikariCP lo, EntityManager chỉ dùng chúng. "Web page rendering" là việc của view như Thymeleaf, nằm ở tầng hiển thị chứ không ở tầng dữ liệu.
Mở trang câu hỏi này →
A@Primary
B@Id
C@Generated
D@Key
Lời giải
Đáp án đúng: "@Id". Trong JPA, @Id đặt lên trường hoặc getter để chỉ định khoá chính của entity; mỗi entity bắt buộc có định danh như vậy (hoặc @EmbeddedId cho khoá ghép), persistence context dùng khoá này để nhận diện thực thể, và nó thường đi kèm @GeneratedValue để sinh giá trị tự động. "@Primary" là annotation của Spring, chọn bean ưu tiên khi có nhiều bean cùng kiểu để tiêm, không liên quan tới bảng. "@Generated" không phải annotation khoá chính của JPA: Hibernate có một annotation cùng tên để đọc lại giá trị cột do cơ sở dữ liệu sinh, còn jakarta.annotation.Generated đánh dấu mã nguồn được sinh tự động. "@Key" không tồn tại trong đặc tả JPA, có lẽ dễ nhầm với từ khoá PRIMARY KEY của SQL.
Mở trang câu hỏi này →
AJDBC
BJPQL (Java Persistence Query Language)
CSQL
DXML
Lời giải

Đáp án đúng: "JPQL (Java Persistence Query Language)". JPQL là ngôn ngữ truy vấn của đặc tả JPA, viết theo tên entity và tên trường của lớp Java thay vì tên bảng và tên cột, ví dụ SELECT s FROM Student s WHERE s.gpa > 3; JPA provider như Hibernate dịch câu đó sang SQL đúng phương ngữ của cơ sở dữ liệu, kết quả trả về là đối tượng entity, và nó hỗ trợ đi theo quan hệ bằng dấu chấm hay JOIN FETCH. "JDBC" là API cấp thấp để gửi câu SQL thô và đọc ResultSet, ta tự chuyển dòng thành đối tượng. "SQL" chính là ngôn ngữ thao tác trên bảng và cột mà câu hỏi muốn tránh; JPA vẫn cho chạy native query nhưng đó không phải truy vấn hướng đối tượng. "XML" là định dạng dữ liệu, dùng cho tệp cấu hình như persistence.xml chứ không phải ngôn ngữ truy vấn.

Mở trang câu hỏi này →
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@OneToMany". Trong quan hệ một nhiều, phía một (ví dụ Department) giữ một tập hợp các entity phía nhiều (danh sách Employee), nên trường tập hợp đó được gắn @OneToMany, thường viết @OneToMany(mappedBy = "department") để chỉ ra phía nhiều mới là chủ quan hệ, nơi giữ cột khoá ngoại, kèm cascade hay orphanRemoval nếu cần. "@ManyToOne" là annotation của chiều ngược lại, đặt trên trường department trong Employee ở phía nhiều, trỏ tới một đối tượng đơn chứ không quản lý tập hợp. "@OneToOne" mô tả quan hệ một một, mỗi bên chỉ có tối đa một đối tượng. "@ManyToMany" mô tả quan hệ nhiều nhiều qua bảng nối, khi phần tử con có thể thuộc về nhiều cha cùng lúc, khác với một nhiều.
Mở trang câu hỏi này →
AThe database table name.
BThe primary key of the "many" side entity.
CThe field in the "many" side entity that maps back to the "one" side entity.
DThe join table name.
Lời giải
Đáp án đúng: "The field in the "many" side entity that maps back to the "one" side entity.". Trong quan hệ hai chiều, ví dụ Department có danh sách employees đánh dấu @OneToMany và Employee có trường department đánh dấu @ManyToOne, mappedBy trên phía Department ghi tên trường department ở phía nhiều; nó báo JPA rằng phía nhiều mới là phía sở hữu quan hệ (owning side), nơi giữ cột khoá ngoại, còn phía một chỉ phản chiếu nên không sinh thêm cột hay bảng nối. "The database table name." sai vì tên bảng đặt bằng @Table. "The primary key of the "many" side entity." sai vì khoá chính của entity bên nhiều khai báo bằng @Id trong chính entity đó, mappedBy không nhắc tới khoá. "The join table name." sai vì bảng nối đặt bằng @JoinTable, và dùng mappedBy chính là để khỏi cần bảng nối mà tái dùng khoá ngoại phía nhiều.
Mở trang câu hỏi này →
A@Entity
B@Table
C@Id
D@JoinColumn
Lời giải
Đáp án đúng: "@Id". @Id đánh dấu trường làm khoá chính của entity, tương ứng cột primary key trong bảng; JPA dùng giá trị này để định danh entity trong persistence context, cho em.find tra cứu, và thường đi kèm @GeneratedValue để cơ sở dữ liệu hoặc provider sinh giá trị, ví dụ chiến lược IDENTITY hay SEQUENCE. Mỗi entity bắt buộc có khoá chính. "@Entity" đánh dấu cả lớp là một entity được JPA quản lý, không chỉ định trường nào là khoá. "@Table" đặt tên bảng, schema hay ràng buộc unique cho entity, ở cấp lớp. "@JoinColumn" chỉ định cột khoá ngoại trong một quan hệ như @ManyToOne, tức trỏ tới khoá chính của bảng khác chứ không khai báo khoá chính của bảng mình.
Mở trang câu hỏi này →
34What does ORM stand for in JPA?4 lựa chọn
AObject Relational Mapping
BOpen Resource Management
COptimized Runtime Module
DOperational Reference Model
Lời giải
Đáp án đúng: "Object Relational Mapping". ORM nghĩa là ánh xạ đối tượng sang quan hệ: kỹ thuật nối mô hình hướng đối tượng của Java (lớp, thuộc tính, tham chiếu) với mô hình quan hệ của cơ sở dữ liệu (bảng, cột, khoá ngoại), để lớp thực thể tương ứng với bảng và mỗi đối tượng tương ứng với một dòng. JPA là đặc tả ORM chuẩn của Java, còn Hibernate là một hiện thực của nó. "Open Resource Management" không phải thuật ngữ của JPA, tên này nghe như quản lý tài nguyên chung. "Optimized Runtime Module" cũng là cụm đặt ra, không gắn với ánh xạ dữ liệu. "Operational Reference Model" không phải nghĩa của ORM trong ngữ cảnh JPA, cụm này không liên quan đối tượng hay bảng.
Mở trang câu hỏi này →
AManaging user interfaces
BProviding RESTful API support
CManaging relational data through ORM
DRunning multithreaded processes
Lời giải
Đáp án đúng: "Managing relational data through ORM". Vai trò chính của JPA là quản lý dữ liệu quan hệ thông qua ORM (Object-Relational Mapping, ánh xạ đối tượng sang quan hệ): lập trình viên làm việc với đối tượng Java gắn @Entity, còn EntityManager cùng nhà cung cấp như Hibernate lo sinh SQL, đồng bộ thay đổi trong persistence context xuống bảng và nạp hàng trong bảng lên thành đối tượng. "Managing user interfaces" là việc của JavaFX, Swing hoặc tầng view như Thymeleaf. "Providing RESTful API support" thuộc về Spring MVC với @RestController hay Jakarta REST, JPA chỉ lo phần lưu trữ phía sau. "Running multithreaded processes" là phạm vi của java.util.concurrent, ExecutorService, không phải đặc tả lưu trữ dữ liệu.
Mở trang câu hỏi này →
A@Query
B@NamedQuery
C@StoredProcedure
D@NativeQuery
Lời giải
Đáp án đúng: "@NamedQuery". Theo JPA, @NamedQuery đặt trên lớp thực thể khai báo một câu JPQL tĩnh có tên qua hai thuộc tính name và query, ví dụ tên Student.findByName; truy vấn được kiểm tra khi khởi động và gọi lại bằng em.createNamedQuery hoặc qua phương thức repository trùng tên. "@Query" là annotation của Spring Data, gắn câu JPQL hoặc SQL trực tiếp lên một phương thức repository; nó có truy vấn nhưng không định nghĩa named query, vì truy vấn đó không có tên dùng chung và chỉ thuộc về đúng phương thức ấy. "@StoredProcedure" không phải annotation của JPA; thủ tục lưu sẵn được khai báo bằng @NamedStoredProcedureQuery. "@NativeQuery" không phải cách định nghĩa named query trong JPA; Spring Data bản mới có annotation này nhưng chỉ là dạng tắt của @Query cho SQL thuần, còn truy vấn SQL thuần có tên dùng @NamedNativeQuery.
Mở trang câu hỏi này →
Aem.detach(entity)
Bem.persist(entity)
Cem.clear()
Dem.flush()
Lời giải
Đáp án đúng: "em.persist(entity)". Entity ở trạng thái transient (tạm thời) là đối tượng vừa new, chưa gắn với persistence context và chưa có dòng tương ứng trong cơ sở dữ liệu; gọi persist trong một giao dịch sẽ đưa nó sang trạng thái managed, provider lên lịch câu INSERT và thực thi khi flush hoặc commit, còn khoá chính có thể được gán ngay nếu dùng chiến lược IDENTITY. "em.detach(entity)" làm ngược lại, tách một entity managed ra khỏi persistence context để nó thành detached. "em.clear()" tách toàn bộ entity đang được quản lý, xoá sạch persistence context. "em.flush()" chỉ đẩy các thay đổi đang chờ của entity đã managed xuống cơ sở dữ liệu; nó không đưa một đối tượng transient vào quản lý, nên entity mới tạo mà chưa persist sẽ không được ghi.
Mở trang câu hỏi này →
38What is JPQL primarily used for?4 lựa chọn
AQuerying entities and their relationships in an object-oriented way
BDefining database connection pools
CGenerating database schemas automatically from UML
DEncrypting fields before persistence
Lời giải
Đáp án đúng: "Querying entities and their relationships in an object-oriented way". JPQL (Java Persistence Query Language) là ngôn ngữ truy vấn của JPA viết trên tên lớp thực thể và thuộc tính chứ không trên tên bảng, cột, ví dụ SELECT s FROM Student s JOIN s.courses c. Persistence provider dịch nó sang SQL của từng cơ sở dữ liệu, và có thể đi theo quan hệ giữa các thực thể bằng dấu chấm hoặc JOIN. "Defining database connection pools" là việc của cấu hình DataSource và pool như HikariCP. "Generating database schemas automatically from UML" sai vì JPQL không đọc UML; việc sinh schema từ thực thể do provider làm qua thuộc tính như hibernate.hbm2ddl.auto, không liên quan JPQL. "Encrypting fields before persistence" thuộc AttributeConverter hoặc thư viện mã hoá, không phải ngôn ngữ truy vấn.
Mở trang câu hỏi này →
A@Component
B@Service
C@Entity
D@Controller
Lời giải
Đáp án đúng: "@Entity". Khi dùng Spring ORM với Hibernate qua JPA, @Entity đánh dấu một lớp Java là thực thể được ánh xạ sang một bảng trong cơ sở dữ liệu, mặc định trùng tên lớp, có thể đổi bằng @Table(name = ...); lớp phải có trường khoá chính gắn @Id và constructor không tham số để Hibernate tạo đối tượng khi nạp dữ liệu. "@Component" chỉ đánh dấu lớp là bean chung để component scan đăng ký vào IoC container, không ánh xạ bảng nào. "@Service" là một dạng @Component cho lớp tầng nghiệp vụ. "@Controller" đánh dấu lớp tầng web xử lý yêu cầu HTTP; cả ba đều là annotation quản lý bean của Spring chứ không phải annotation ánh xạ của JPA.
Mở trang câu hỏi này →
A@Column
B@Id
C@GeneratedValue
D@Table
Lời giải
Đáp án đúng: "@Table". Annotation @Table của JPA đặt trên lớp thực thể để chỉ định tên bảng qua thuộc tính name, kèm schema, catalog, uniqueConstraints và indexes; nếu không có, tên bảng mặc định suy ra từ tên thực thể, và Hibernate trong Spring Boot còn đổi tên đó sang dạng chữ thường nối gạch dưới. Ví dụ lớp Student muốn lưu vào bảng students thì đặt @Table với name là students. @Entity khai báo lớp là thực thể, còn @Table chỉ tinh chỉnh ánh xạ bảng. "@Column" đặt tên và cấu hình cho một cột, không phải cho bảng. "@Id" đánh dấu trường khoá chính. "@GeneratedValue" chỉ định cách sinh giá trị khoá chính như IDENTITY, SEQUENCE, AUTO, không liên quan tên bảng.
Mở trang câu hỏi này →