Danh sách câu hỏi của đề

Câu hỏi: HSF302 Làm việc với Spring Framework – Bộ ôn tập cuối kỳ số 3

50 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 đúng thứ tự trong đề. Trang 2/3 — câu 21–40.

Danh sách câu hỏi

40/50 câuCòn 10
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 →
AA command-line tool to compile and run Groovy scripts, supporting rapid prototyping
BA tool that provisions cloud resources on AWS only
CA dedicated debugger for Spring MVC controllers
DA SQL client bundled with Spring Boot
Lời giải
Đáp án đúng: "A command-line tool to compile and run Groovy scripts, supporting rapid prototyping". Spring Boot CLI là công cụ dòng lệnh cho phép viết một tệp Groovy ngắn chứa controller rồi chạy ngay bằng lệnh spring run, CLI tự suy và kéo các dependency cần thiết, tự thêm import, nên rất hợp để thử nghiệm nhanh mà không cần dựng dự án Maven hay Gradle đầy đủ; ở các bản Spring Boot 3 về sau, CLI tập trung vào việc khởi tạo dự án như spring init, nhưng mô tả kinh điển của nó vẫn là chạy script Groovy để tạo mẫu nhanh. "A tool that provisions cloud resources on AWS only" sai vì việc cấp phát hạ tầng đám mây là của các công cụ như AWS CLI hay Terraform, Spring Boot CLI không làm việc đó. "A dedicated debugger for Spring MVC controllers" sai vì CLI không phải trình gỡ lỗi, việc này do IDE và JVM debugger đảm nhận. "A SQL client bundled with Spring Boot" sai vì Spring Boot không kèm công cụ khách SQL nào, CLI cũng không kết nối cơ sở dữ liệu để chạy lệnh SQL.
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 →
Aem.persist(entity);
Bem.remove(entity);
Cem.find(Entity.class, id);
Dem.merge(entity);
Lời giải

Đáp án đúng: "em.merge(entity); ". Cập nhật một entity trong ứng dụng JavaFX thường diễn ra khi đối tượng đã được nạp từ trước, hiển thị trên form, người dùng sửa rồi bấm lưu; lúc đó entity đã ở trạng thái detached (tách khỏi persistence context) vì EntityManager cũ đã đóng, nên phải gọi merge trong một giao dịch: JPA chép trạng thái của nó vào bản managed có cùng khoá chính và khi commit sẽ sinh câu UPDATE. Chú ý merge trả về bản managed, còn đối tượng truyền vào vẫn detached. "em.persist(entity); " dùng cho entity mới, sinh INSERT và báo lỗi khi gặp entity detached. "em.remove(entity); " xoá entity, sinh DELETE. "em.find(Entity.class, id);"chỉ nạp entity theo khoá chính, là bước đọc chứ không ghi thay đổi; tuy entity vừa find rồi sửa trong cùng giao dịch cũng được cập nhật nhờ dirty checking, bản thân lệnh đó không thực hiện việc cập nhật.

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 →
AJava VM
BSpring IoC Container
CJDBC Driver
DREST Controller
Lời giải
Đáp án đúng: "Spring IoC Container". Trong Spring, bean là đối tượng do IoC container (vùng chứa đảo ngược điều khiển), cụ thể là BeanFactory và ApplicationContext, tạo ra, tiêm phụ thuộc, gọi các callback khởi tạo, quản lý phạm vi (scope) và huỷ khi đóng ngữ cảnh; mã ứng dụng không tự new các đối tượng đó mà nhận chúng từ container. "Java VM" là máy ảo chạy bytecode và cấp phát bộ nhớ cho mọi đối tượng Java, nhưng nó không biết gì về định nghĩa bean, quan hệ phụ thuộc hay vòng đời theo cấu hình Spring. "JDBC Driver" chỉ là trình điều khiển giúp mã Java nói chuyện với một hệ quản trị cơ sở dữ liệu cụ thể. "REST Controller" là một loại bean xử lý yêu cầu HTTP, tức là đối tượng được container quản lý chứ không phải thứ quản lý các bean khác.
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 →
ARobust transaction management.
BComprehensive web development support through Spring MVC.
CAutomatic generation of user interfaces.
DStrong community support and extensive documentation.
Lời giải
Đáp án đúng: "Automatic generation of user interfaces.". Câu hỏi tìm điều KHÔNG phải ưu điểm chung của Spring, và Spring không hề tự sinh giao diện người dùng: lập trình viên vẫn phải tự viết template Thymeleaf, JSP hoặc front-end riêng, Spring chỉ cung cấp hạ tầng để nối dữ liệu vào view. "Robust transaction management." là ưu điểm thật, vì @Transactional và PlatformTransactionManager cho phép quản lý giao dịch khai báo, thống nhất cho JDBC, JPA hay JTA, nên không được chọn. "Comprehensive web development support through Spring MVC." cũng đúng, Spring MVC cung cấp DispatcherServlet, controller, data binding, validation và REST. "Strong community support and extensive documentation." đúng nốt, Spring có cộng đồng rất lớn và tài liệu tham khảo chính thức đầy đủ, nên cũng không phải đáp án.
Mở trang câu hỏi này →
ALabel
BTextField
CTableView
DButton
Lời giải
Đáp án đúng: "TableView". TableView là control của JavaFX hiển thị danh sách đối tượng dạng bảng: mỗi cột là một TableColumn gắn cellValueFactory, thường là PropertyValueFactory hoặc lambda trỏ tới thuộc tính của đối tượng, còn dữ liệu là một ObservableList nên khi danh sách thay đổi bảng tự cập nhật; nó hỗ trợ sắp xếp theo cột, chọn dòng và sửa ô, rất hợp để hiện kết quả truy vấn JPA. "Label" chỉ hiển thị một đoạn chữ hoặc biểu tượng tĩnh. "TextField" là ô nhập một dòng văn bản để người dùng gõ dữ liệu. "Button" là nút bấm phát sinh sự kiện ActionEvent khi được nhấn. Không control nào trong số này có cấu trúc hàng và cột để trình bày dữ liệu dạng bảng.
Mở trang câu hỏi này →
AJdbcTemplate
BJdbcManager
CEntityManager
DSqlHelper
Lời giải
Đáp án đúng: "JdbcTemplate". JdbcTemplate là lớp trung tâm của module Spring JDBC: nó tự mở và đóng Connection, tạo Statement, duyệt ResultSet, xử lý ngoại lệ và dịch SQLException thành DataAccessException, nên lập trình viên chỉ viết câu SQL và một RowMapper để ánh xạ dòng thành đối tượng, bớt hẳn mã lặp lại của JDBC thuần. "JdbcManager" không phải lớp có trong Spring Framework. "EntityManager" thuộc JPA, quản lý thực thể và persistence context, làm việc ở tầng ORM chứ không phải công cụ giản lược JDBC. "SqlHelper" cũng không phải lớp của Spring, chỉ là một cái tên chung chung đặt ra làm nhiễu, dễ gây nhầm với các lớp tiện ích tự viết trong dự án.
Mở trang câu hỏi này →
Ath:if
Bth:each
Cth:text
Dth:href
Lời giải

Đáp án đúng: "th:if". th:if đánh giá một biểu thức, ví dụ th:

Lời giải
if="${user.admin}";

nếu kết quả là true, Thymeleaf giữ lại thẻ cùng toàn bộ nội dung bên trong khi render, nếu false thì thẻ bị loại khỏi HTML đầu ra; th:unless làm điều ngược lại. Đây là cách hiển thị có điều kiện, như chỉ hiện nút xoá cho quản trị viên. "th:each" là thuộc tính lặp, nhân bản thẻ cho từng phần tử của một tập hợp, ví dụ mỗi sản phẩm một dòng bảng. "th:text" thay nội dung chữ của thẻ bằng giá trị biểu thức, có escape HTML. "th:href" tạo giá trị thuộc tính href cho liên kết, thường dùng cú pháp @{...} để sinh URL có context path. Không thuộc tính nào trong số đó quyết định việc thẻ có xuất hiện hay không.

Mở trang câu hỏi này →
A@Aspect
B@Controller
C@Repository
D@Configuration
Lời giải
Đáp án đúng: "@Aspect". Trong Spring AOP (lập trình hướng khía cạnh), @Aspect lấy từ AspectJ đánh dấu một lớp là aspect, tức mô-đun gom logic cắt ngang như ghi log, đo thời gian; bên trong khai báo pointcut bằng @Pointcut và advice bằng @Before, @After, @Around. Lớp này phải đồng thời là bean (thêm @Component) và cần bật hỗ trợ bằng @EnableAspectJAutoProxy, hoặc được Spring Boot bật tự động, khi đó Spring tạo proxy bọc các bean khớp pointcut. "@Controller" đánh dấu lớp xử lý yêu cầu web trong Spring MVC. "@Repository" đánh dấu lớp truy cập dữ liệu và bật dịch ngoại lệ sang DataAccessException. "@Configuration" đánh dấu lớp chứa các phương thức @Bean khai báo cấu hình; nó có thể dùng kèm để bật AOP nhưng không định nghĩa aspect.
Mở trang câu hỏi này →
AIn the View layer.
BIn the Controller or Service layer.
CDirectly in the Entity class.
DInside the JavaFX Application class.
Lời giải
Đáp án đúng: "In the Controller or Service layer.". EntityManager là giao diện JPA thao tác với persistence context (ngữ cảnh lưu trữ), được tạo từ EntityManagerFactory; trong ứng dụng JavaFX không có Spring quản lý, nó thường được tạo và đóng ở tầng xử lý phía sau giao diện, mỗi thao tác hoặc mỗi giao dịch một EntityManager. Nói chặt chẽ thì thiết kế chuẩn đặt EntityManager ở tầng service hoặc DAO, còn controller JavaFX chỉ nên gọi service, nên việc gộp cả Controller vào đây hơi lỏng; dù vậy đây vẫn là lựa chọn duy nhất chỉ đúng vùng xử lý nghiệp vụ. "In the View layer." sai vì tầng giao diện chỉ hiển thị, đưa truy cập dữ liệu vào đó phá vỡ việc tách lớp. "Directly in the Entity class." sai vì entity là đối tượng được EntityManager quản lý, để nó tự giữ EntityManager là đảo ngược quan hệ. "Inside the JavaFX Application class." sai vì lớp Application lo vòng đời cửa sổ, đặt EntityManager ở đó là trộn giao diện với truy cập dữ liệu.
Mở trang câu hỏi này →
Aspring-boot-starter-web
Bspring-boot-starter-data-jpa
Cspring-boot-starter-test
Dspring-boot-devtools
Lời giải
Đáp án đúng: "spring-boot-starter-data-jpa". Starter này kéo theo Spring Data JPA, Hibernate làm JPA provider, spring-jdbc và HikariCP làm connection pool; khi thấy chúng trên classpath cùng thông tin spring.datasource, auto-configuration tự dựng DataSource, EntityManagerFactory, transaction manager và bật quét các interface repository. "spring-boot-starter-web" dùng cho Spring MVC và Tomcat nhúng, không chứa JPA. "spring-boot-starter-test" cung cấp JUnit, Mockito, AssertJ cho kiểm thử, thường đặt ở phạm vi test. "spring-boot-devtools" chỉ hỗ trợ lúc phát triển như tự khởi động lại và LiveReload, không thêm khả năng truy cập dữ liệu. Ngoài starter này vẫn cần driver của cơ sở dữ liệu cụ thể như mysql-connector-j, nhưng đó là phần bổ sung chứ không phải thứ bật Spring Data JPA.
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 →
A.xml
B.conf
C.java
D.yml
Lời giải
Đáp án đúng: ".java". Cấu hình Spring dựa trên annotation (Java-based configuration) được viết thẳng bằng mã Java: một lớp gắn @Configuration chứa các phương thức @Bean, kết hợp @ComponentScan hay @EnableTransactionManagement, được lưu trong tệp nguồn Java rồi biên dịch như mọi lớp khác, thay cho cách khai báo bean trong XML truyền thống. ".xml" là phần mở rộng của cấu hình XML kiểu applicationContext với thẻ bean, chính là thứ cấu hình annotation thay thế. ".conf" không phải định dạng cấu hình chuẩn của Spring, thường gặp ở cấu hình máy chủ như Nginx. ".yml" là tệp YAML mà Spring Boot dùng cho application.yml để khai báo giá trị thuộc tính như cổng, URL cơ sở dữ liệu; nó chứa dữ liệu cấu hình chứ không định nghĩa bean bằng annotation.
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 →
AReact
BVue.js
CThymeleaf
DAngular
Lời giải
Đáp án đúng: "Thymeleaf". Thymeleaf là template engine phía máy chủ: controller Spring MVC trả tên view, ThymeleafViewResolver tìm tệp HTML tương ứng trong thư mục templates rồi dựng trang từ dữ liệu trong model trước khi gửi về trình duyệt, nên nó là công nghệ view gắn trực tiếp với Spring MVC và được Spring Boot tự cấu hình qua spring-boot-starter-thymeleaf. "React" là thư viện JavaScript dựng giao diện phía trình duyệt; nó dùng được cùng ứng dụng Spring qua REST API nhưng là frontend tách rời, không phải view do Spring MVC dựng. "Vue.js" cũng là framework JavaScript phía client, quan hệ với Spring chỉ qua gọi API JSON. "Angular" là framework SPA (ứng dụng một trang) chạy trên trình duyệt, cùng lắm được phục vụ như tệp tĩnh chứ không đi qua ViewResolver.
Mở trang câu hỏi này →
ASelection variable expressions.
BURL expressions.
CMessage expressions.
DFragment expressions.
Lời giải
Đáp án đúng: "Selection variable expressions.". Trong Thymeleaf, *{...} là biểu thức biến lựa chọn: nó được đánh giá trên đối tượng đang được chọn bằng th:object chứ không phải trên toàn bộ model, ví dụ form có th:object="${user}" thì bên trong th:field="*{name}" tương đương ${user.name}; đây là cách viết gọn rất hay dùng khi gắn form với đối tượng. "URL expressions." là cú pháp @{...}, dùng để dựng đường dẫn có context path và tham số. "Message expressions." là cú pháp #{...}, dùng để tra khoá thông điệp trong tệp messages phục vụ đa ngôn ngữ. "Fragment expressions." là cú pháp ~{...}, dùng với th:insert hoặc th:replace để chèn một mảnh template.
Mở trang câu hỏi này →
AEntityManager
BJdbcTemplate
CSessionFactory
DRepository
Lời giải
Đáp án đúng: "JdbcTemplate". Trong Spring JDBC, JdbcTemplate là lớp chạy câu SQL: query với RowMapper để đọc nhiều dòng, queryForObject để lấy một giá trị, update để thêm, sửa, xoá; nó lo mở, đóng kết nối và dịch SQLException thành DataAccessException. "EntityManager" là API của JPA, làm việc với thực thể và JPQL chứ không phải công cụ của Spring JDBC. "SessionFactory" là của Hibernate gốc, tạo Session để thao tác ORM, cũng không thuộc Spring JDBC. "Repository" là khái niệm tầng truy cập dữ liệu, ứng với annotation @Repository hoặc interface của Spring Data; bên trong một repository có thể dùng JdbcTemplate, nhưng bản thân Repository không phải lớp thực thi SQL.
Mở trang câu hỏi này →