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.

Danh sách câu hỏi

20/40 câuCòn 20
ABy querying the Student entity with a join on the Course entity.
BBy querying the join table directly.
CBy querying the Course entity and accessing its students collection.
DBy querying the Student entity and filtering based on the course ID in the Student table.
Lời giải
Đáp án đúng: "By querying the Student entity with a join on the Course entity.". Trong JPA, quan hệ Many-to-Many được ánh xạ thành thuộc tính tập hợp, chẳng hạn Student có courses, nên truy vấn JPQL (Java Persistence Query Language, ngôn ngữ truy vấn trên thực thể) điển hình là SELECT s FROM Student s JOIN s.courses c WHERE c.id = :courseId, lấy đúng tập sinh viên cần trong một câu truy vấn. Phương án "By querying the Course entity and accessing its students collection." cũng lấy được dữ liệu, nhưng đó là nạp một Course rồi duyệt quan hệ (thường kích hoạt lazy loading thêm một truy vấn) chứ không phải dựng một truy vấn JPA lọc sinh viên, nên không phải cách cấu trúc truy vấn được hỏi. "By querying the join table directly." sai vì bảng nối không phải thực thể, JPQL không truy vấn được nó trừ khi viết SQL thuần, làm mất lợi ích của ORM. "By querying the Student entity and filtering based on the course ID in the Student table." sai vì với Many-to-Many, bảng Student không có cột course ID; khoá ngoại nằm ở bảng nối.
Mở trang câu hỏi này →
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@ManyToMany". Annotation @ManyToMany của đặc tả JPA đánh dấu một thuộc tính tập hợp mà mỗi phía có thể liên kết với nhiều bản ghi của phía kia, ví dụ một sinh viên học nhiều khoá học và một khoá học có nhiều sinh viên; quan hệ này được lưu qua một bảng nối (join table), có thể đặt tên và cột bằng @JoinTable ở phía sở hữu, phía còn lại dùng mappedBy. "@OneToOne" chỉ dùng khi mỗi thực thể gắn với đúng một thực thể kia, như người dùng và hồ sơ cá nhân. "@ManyToOne" mô tả phía nhiều trỏ về một, như nhiều đơn hàng thuộc một khách hàng, khoá ngoại nằm trên bảng phía nhiều. "@OneToMany" là chiều ngược lại của quan hệ đó, một khách hàng có nhiều đơn hàng, nhưng mỗi đơn hàng vẫn chỉ thuộc một khách hàng nên không diễn tả được quan hệ nhiều-nhiều.
Mở trang câu hỏi này →
AIt specifies the primary key field of an entity
BIt maps an entity field to a table column and allows setting column attributes
CIt marks a field that should not be persisted
DIt defines a many-to-many relationship
Lời giải
Đáp án đúng: "It maps an entity field to a table column and allows setting column attributes". Trong JPA, mỗi trường persistent của entity mặc định ánh xạ tới cột cùng tên; @Column cho phép ghi rõ tên cột và các thuộc tính như name, nullable, unique, length, precision, scale, insertable, updatable, columnDefinition, ví dụ @Column(name = "full_name", nullable = false, length = 100). Hibernate dùng các thông tin này khi sinh DDL tạo bảng và khi dựng câu SQL. "It specifies the primary key field of an entity" là vai trò của @Id, thường đi cùng @GeneratedValue để sinh giá trị khoá. "It marks a field that should not be persisted" là @Transient, trường đó bị bỏ qua hoàn toàn khi lưu và nạp. "It defines a many-to-many relationship" là @ManyToMany, thường kèm @JoinTable để mô tả bảng nối giữa hai entity.
Mở trang câu hỏi này →
A@Table
B@Entity
C@Column
D@Id
Lời giải
Đáp án đúng: "@Entity". Theo đặc tả JPA, annotation @Entity đặt trên lớp báo cho persistence provider như Hibernate rằng lớp này là một thực thể được quản lý, ánh xạ tới một bảng, và EntityManager có thể persist, find, merge nó; mỗi thực thể bắt buộc có khoá chính. "@Table" chỉ là tuỳ chọn bổ sung để đặt tên bảng, schema khi tên mặc định không hợp, bản thân nó không biến lớp thành thực thể. "@Column" cấu hình ánh xạ của một trường tới cột như tên cột, độ dài, cho phép rỗng hay không. "@Id" đánh dấu trường khoá chính của thực thể; nó cần thiết bên trong một thực thể nhưng không phải dấu hiệu khai báo lớp là thực thể. Thiếu @Entity thì các annotation kia trên lớp đều không có tác dụng.
Mở trang câu hỏi này →
ADependency Injection
BAnnotations
CEntity Relationships
DTransactions
Lời giải
Đáp án đúng: "Entity Relationships". JPA cho phép mô tả quan hệ giữa các entity, tương ứng với quan hệ khoá ngoại giữa các bảng, bằng các ánh xạ @OneToOne, @OneToMany, @ManyToOne và @ManyToMany kèm @JoinColumn hoặc @JoinTable; nhờ đó có thể đi từ đối tượng này sang đối tượng liên quan, ví dụ order.getCustomer(), thay vì tự viết câu JOIN. "Dependency Injection" là cơ chế của Spring tiêm phụ thuộc giữa các bean, không liên quan tới quan hệ dữ liệu giữa bảng. "Annotations" là cú pháp khai báo siêu dữ liệu nói chung; ánh xạ quan hệ quả thật được viết bằng annotation, nhưng annotation chỉ là phương tiện và còn dùng cho vô số việc khác như @Id hay @Column, còn tính năng được hỏi là quan hệ entity. "Transactions" bảo đảm một nhóm thao tác cùng thành công hoặc cùng huỷ, không định nghĩa liên kết giữa các bảng.
Mở trang câu hỏi này →
AA low-level JDBC driver for vendor-specific SQL
BA specification for managing relational data in Java applications using object-relational mapping
CA GUI tool for database administration in IntelliJ IDEA
DA NoSQL database used by Java applications
Lời giải
Đáp án đúng: "A specification for managing relational data in Java applications using object-relational mapping". JPA là một đặc tả (specification) của Java, nay thuộc Jakarta EE, định nghĩa cách ánh xạ đối tượng sang bảng quan hệ (ORM) bằng annotation như @Entity, @Id, @OneToMany, cùng API EntityManager và ngôn ngữ truy vấn JPQL; bản thân JPA chỉ là bộ giao diện và luật, phần chạy thật do nhà cung cấp như Hibernate hoặc EclipseLink hiện thực. "A low-level JDBC driver for vendor-specific SQL" sai vì driver JDBC là tầng thấp hơn mà JPA dựa vào bên dưới, JPA còn giúp lập trình viên tránh viết SQL riêng của từng hãng. "A GUI tool for database administration in IntelliJ IDEA" sai vì JPA không phải công cụ giao diện, nó là API dùng trong mã nguồn. "A NoSQL database used by Java applications" sai vì JPA không phải cơ sở dữ liệu và được thiết kế cho dữ liệu quan hệ.
Mở trang câu hỏi này →
AServlet
BEntityManager
CJSP
DJDBC Driver
Lời giải
Đáp án đúng: "EntityManager". EntityManager là giao diện trung tâm của JPA, gắn với một persistence context (ngữ cảnh lưu trữ) là tập các entity đang được quản lý; qua nó ta gọi persist để đưa entity mới vào quản lý, find để nạp theo khoá chính, merge để gộp entity tách rời, remove để xoá và createQuery để chạy JPQL, còn thay đổi trên entity managed được tự động đồng bộ xuống cơ sở dữ liệu khi flush hoặc commit. "Servlet" là thành phần web của Jakarta EE xử lý yêu cầu HTTP, không biết gì về entity. "JSP" là công nghệ trang hiển thị phía máy chủ, thuộc tầng view. "JDBC Driver" là trình điều khiển cấp thấp để gửi câu SQL tới một hệ quản trị cụ thể; JPA provider như Hibernate dùng nó bên dưới, nhưng driver không theo dõi trạng thái entity.
Mở trang câu hỏi này →
A@Column
B@Entity
C@OneToMany
D@Transient
Lời giải
Đáp án đúng: "@OneToMany". Annotation quan hệ trong JPA mô tả cách một thực thể liên kết với thực thể khác; @OneToMany đặt trên thuộc tính tập hợp, ví dụ một Department có danh sách Employee, cho biết một bản ghi phía này gắn với nhiều bản ghi phía kia, thường đi cặp với @ManyToOne ở phía nhiều qua mappedBy. Cùng nhóm còn có @OneToOne, @ManyToOne và @ManyToMany. "@Column" chỉ cấu hình ánh xạ một trường kiểu đơn tới cột của bảng. "@Entity" khai báo lớp là thực thể, không mô tả liên kết giữa các thực thể. "@Transient" đánh dấu trường không được lưu xuống cơ sở dữ liệu, ngược hẳn với việc ánh xạ một quan hệ.
Mở trang câu hỏi này →
ATo define the primary key of the entities.
BTo specify the join table and its columns.
CTo define the entity relationships.
DTo create a new database.
Lời giải
Đáp án đúng: "To specify the join table and its columns.". Trong quan hệ @ManyToMany, hai bảng thực thể được nối qua một bảng trung gian; @JoinTable đặt ở phía sở hữu quan hệ để khai báo tên bảng nối qua name, cột khoá ngoại trỏ về thực thể hiện tại qua joinColumns và cột trỏ về thực thể bên kia qua inverseJoinColumns. Nếu bỏ đi, JPA tự đặt tên bảng nối theo quy ước mặc định. "To define the primary key of the entities." sai vì khoá chính khai báo bằng @Id, có thể kèm @GeneratedValue. "To define the entity relationships." sai vì chính @ManyToMany mới định nghĩa quan hệ, @JoinTable chỉ cấu hình cách lưu quan hệ đó. "To create a new database." sai vì không annotation JPA nào tạo cơ sở dữ liệu; bảng nối có thể được sinh khi bật tính năng tạo schema, nhưng đó là bảng chứ không phải cơ sở dữ liệu.
Mở trang câu hỏi này →
A@OneToOne
B@ManyToOne
C@OneToMany
D@ManyToMany
Lời giải

Đáp án đúng: "@OneToMany". Annotation @OneToMany của JPA khai báo một thực thể giữ tập hợp nhiều thực thể kia, ví dụ một Department có List<Employee>; thường đi kèm mappedBy trỏ tới trường @ManyToOne ở phía Employee, và trong cơ sở dữ liệu quan hệ này được thể hiện bằng cột khoá ngoại đặt ở bảng phía nhiều. "@OneToOne" dành cho quan hệ một một, như User với Profile, mỗi bên chỉ gắn với đúng một bản ghi bên kia. "@ManyToOne" là chiều ngược lại của quan hệ một nhiều, gắn ở phía nhiều như Employee trỏ về một Department; nó cũng tham gia quan hệ này nhưng câu hỏi hỏi annotation khai báo phía một giữ nhiều. "@ManyToMany" dành cho quan hệ nhiều nhiều như Student với Course, thường cần bảng nối.

Mở trang câu hỏi này →
ABy adding a foreign key column to one of the entities.
BBy adding a foreign key column to both entities.
CBy using a join table that contains foreign keys referencing both entities.
DBy storing the related entities in a serialized format within a single column.
Lời giải
Đáp án đúng: "By using a join table that contains foreign keys referencing both entities.". Trong mô hình quan hệ, một hàng ở bảng này có thể liên kết với nhiều hàng ở bảng kia và ngược lại, nên không cột khoá ngoại đơn nào diễn tả được; JPA dùng bảng nối (join table) mà mỗi hàng gồm hai khoá ngoại trỏ về khoá chính của hai thực thể, có thể đặt tên qua @JoinTable với joinColumns và inverseJoinColumns, ví dụ bảng student_course giữa Student và Course. "By adding a foreign key column to one of the entities." là cách biểu diễn quan hệ một nhiều hoặc một một, một cột chỉ chứa được một giá trị nên không chứa nổi nhiều liên kết. "By adding a foreign key column to both entities." vẫn chỉ cho mỗi hàng trỏ tới đúng một hàng bên kia, không thành nhiều nhiều. "By storing the related entities in a serialized format within a single column." phá vỡ chuẩn hoá, không truy vấn hay ràng buộc toàn vẹn được, JPA không dùng cách đó cho quan hệ.
Mở trang câu hỏi này →
A@ManyToOne
B@OneToOne
C@OneToMany
D@ManyToMany
Lời giải
Đáp án đúng: "@OneToMany". @OneToMany đặt trên một trường kiểu tập hợp, ví dụ danh sách các Order trong entity Customer, cho biết một khách hàng có nhiều đơn hàng; nó thường đi kèm mappedBy trỏ tới trường ở phía nhiều để quan hệ hai chiều dùng chung một cột khoá ngoại. "@ManyToOne" mô tả chiều ngược lại, đặt ở phía nhiều, chẳng hạn trường customer trong Order, nơi giữ cột khoá ngoại; nó là nửa kia của quan hệ chứ không khai báo một-nhiều nhìn từ phía một. "@OneToOne" dành cho quan hệ một-một như User và Profile, mỗi bên chỉ có tối đa một đối tượng tương ứng. "@ManyToMany" dành cho quan hệ nhiều-nhiều như Student và Course, cần một bảng nối ở giữa.
Mở trang câu hỏi này →
ASpring MVC
BHibernate
CJavaFX
DSwing
Lời giải
Đáp án đúng: "Hibernate". Hibernate là framework ORM (Object-Relational Mapping, ánh xạ đối tượng sang quan hệ) phổ biến nhất của Java: nó ánh xạ lớp Java sang bảng, tự sinh SQL cho thao tác thêm, sửa, xoá, truy vấn, quản lý persistence context và cache, đồng thời là nhà cung cấp JPA mặc định mà Spring Boot dùng khi thêm starter Data JPA. "Spring MVC" là framework web theo mẫu Model-View-Controller, xử lý yêu cầu HTTP qua DispatcherServlet chứ không ánh xạ đối tượng sang bảng. "JavaFX" là bộ công cụ xây dựng giao diện ứng dụng desktop. "Swing" cũng là thư viện giao diện desktop, ra đời trước JavaFX, không liên quan tới truy cập dữ liệu.
Mở trang câu hỏi này →
A@OneToMany
B@ManyToOne
C@OneToOne
D@Autowired
Lời giải
Đáp án đúng: "@Autowired". Câu hỏi tìm annotation KHÔNG thuộc nhóm quan hệ của JPA. @Autowired là annotation của Spring dùng để tiêm phụ thuộc, yêu cầu container tìm bean phù hợp theo kiểu rồi gán vào trường, setter hay constructor; nó không mô tả quan hệ giữa các entity. "@OneToMany" là annotation quan hệ chuẩn trong jakarta.persistence, đặt ở phía một để giữ tập hợp nhiều entity con, ví dụ một Department có nhiều Employee, nên nó thuộc nhóm và không được chọn. "@ManyToOne" cũng là quan hệ chuẩn, đặt ở phía nhiều và thường kèm @JoinColumn chỉ cột khoá ngoại. "@OneToOne" là quan hệ chuẩn một một, như User với hồ sơ Profile. Cùng với @ManyToMany, chúng tạo thành bốn annotation quan hệ của đặc tả JPA.
Mở trang câu hỏi này →
ATo define a single named query
BTo define multiple named queries
CTo define a primary key
DTo define a foreign key
Lời giải
Đáp án đúng: "To define multiple named queries". Named query là câu JPQL được đặt tên, khai báo tĩnh trên lớp thực thể bằng @NamedQuery với name và query, rồi gọi qua em.createNamedQuery. Ở các bản JPA trước 2.2, @NamedQuery không lặp lại được trên cùng một lớp, nên @NamedQueries làm annotation chứa, nhận một mảng nhiều @NamedQuery; từ JPA 2.2 có thể lặp trực tiếp, nhưng @NamedQueries vẫn là cách gom nhiều truy vấn đặt tên. "To define a single named query" là việc của chính @NamedQuery. "To define a primary key" là việc của @Id hoặc @EmbeddedId. "To define a foreign key" thuộc về @JoinColumn trên quan hệ, hoặc @ForeignKey để đặt tên ràng buộc, không liên quan truy vấn đặt tên.
Mở trang câu hỏi này →
Đề bài
private Long id;
AIt creates a foreign key for the entity
BIt marks the field as a version column
CIt marks the field as the primary key with auto-increment strategy
DIt disables the persistence of the field
Lời giải
Đáp án đúng: "It marks the field as the primary key with auto-increment strategy". Lần theo mã: @Id đánh dấu trường id là khoá chính của entity, còn @GeneratedValue(strategy = GenerationType.IDENTITY) báo JPA không tự cấp giá trị mà để cột identity hay auto-increment của cơ sở dữ liệu sinh khi INSERT, sau đó provider đọc lại khoá vừa sinh và gán vào trường id kiểu Long. "It creates a foreign key for the entity" sai vì khoá ngoại khai báo bằng @ManyToOne hoặc @OneToOne kèm @JoinColumn, không phải @Id. "It marks the field as a version column" sai vì cột phiên bản cho khoá lạc quan (optimistic locking) dùng @Version. "It disables the persistence of the field" sai vì muốn một trường không được lưu xuống bảng thì dùng @Transient; ở đây trường id lại là trường quan trọng nhất được lưu.
Mở trang câu hỏi này →
Asave()
Binsert()
Cpersist()
Dstore()
Lời giải
Đáp án đúng: "persist()". Trong JPA, EntityManager.persist(entity) đưa một thực thể mới từ trạng thái transient (tạm thời) vào persistence context để nó thành managed; câu lệnh INSERT thực sự được gửi khi flush hoặc khi transaction commit. EntityManager còn có merge, remove, find, nhưng thêm mới là persist. "save()" là chỗ dễ nhầm: đó là phương thức của repository trong Spring Data JPA, và bên trong SimpleJpaRepository.save lại gọi persist hoặc merge tuỳ thực thể mới hay cũ, nó cũng có trong Session của Hibernate, nhưng không thuộc EntityManager. "insert()" không có trong API EntityManager, INSERT là câu SQL do JPA tự sinh. "store()" cũng không phải phương thức của EntityManager.
Mở trang câu hỏi này →
Aem.persist(entity);
Bem.remove(entity);
Cem.find(Entity.class, id);
Dem.merge(entity);
Lời giải

Đáp án đúng: "em.find(Entity.class, id); ". Phương thức find của EntityManager tìm thực thể theo khoá chính: trước hết nó tra trong persistence context, nếu chưa có thì phát câu SELECT, rồi trả về đối tượng đã được quản lý hoặc null nếu không tồn tại; đây là thao tác đọc (Read) trong CRUD. "em.persist(entity); " đưa một thực thể mới vào trạng thái được quản lý để INSERT khi flush, tức thao tác tạo. "em.remove(entity); " đánh dấu thực thể đang được quản lý để xoá, sinh DELETE khi flush. "em.merge(entity);"chép trạng thái của một thực thể tách rời (detached) vào bản được quản lý và trả về bản đó, dùng để cập nhật chứ không phải đọc.

Mở trang câu hỏi này →
ATo manage application configurations.
BTo manage persistent entities.
CTo handle user authentication.
DTo create user interfaces.
Lời giải
Đáp án đúng: "To manage persistent entities.". EntityManager là giao diện JPA gắn với một persistence context, tập các entity đang ở trạng thái managed; nó cung cấp persist, find, merge, remove, refresh, detach, flush và createQuery, đồng thời theo dõi thay đổi trên các entity managed để tự đồng bộ xuống cơ sở dữ liệu khi flush hoặc commit giao dịch. Trong Spring, EntityManager được tiêm bằng @PersistenceContext và các repository của Spring Data JPA cũng gọi nó bên dưới. "To manage application configurations." là việc của Environment và cơ chế properties của Spring Boot. "To handle user authentication." là việc của Spring Security với AuthenticationManager. "To create user interfaces." thuộc tầng hiển thị như Thymeleaf hay JavaFX, không phải tầng lưu trữ.
Mở trang câu hỏi này →
AA web templating engine
BA library for UI development
CA JPA implementation that simplifies ORM
DA Java compiler extension
Lời giải
Đáp án đúng: "A JPA implementation that simplifies ORM". Hibernate là framework ORM (Object Relational Mapping, ánh xạ đối tượng sang quan hệ) cho Java và là hiện thực JPA phổ biến nhất, cũng là persistence provider mặc định của Spring Boot khi dùng spring-boot-starter-data-jpa; nó ánh xạ lớp thực thể thành bảng, tự sinh SQL, quản lý persistence context, lazy loading và bộ đệm, giúp lập trình viên thao tác đối tượng thay vì viết JDBC thủ công. "A web templating engine" mô tả Thymeleaf hoặc FreeMarker, những công cụ sinh trang HTML. "A library for UI development" mô tả JavaFX hay Swing, không liên quan tầng dữ liệu. "A Java compiler extension" sai vì Hibernate là thư viện chạy lúc runtime, không mở rộng trình biên dịch; dù có công cụ sinh metamodel lúc biên dịch, đó không phải bản chất của nó.
Mở trang câu hỏi này →