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ố 1

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 3/3 — câu 41–50.

Danh sách câu hỏi

50/50 câuHết danh sách
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 →
AHibernate
BEclipseLink
CMyBatis
DAll of the above
Lời giải
Đáp án đúng: "All of the above". Spring không tự làm ORM (ánh xạ đối tượng – quan hệ) mà tích hợp các công cụ có sẵn: Hibernate và EclipseLink là hai bản cài đặt JPA, được nối vào qua lớp hỗ trợ ORM/JPA của Spring như LocalContainerEntityManagerFactoryBean và JpaTransactionManager; MyBatis tích hợp qua dự án mybatis-spring với SqlSessionFactoryBean, dùng chung DataSource và quản lý giao dịch của Spring. Nói chặt chẽ thì MyBatis là công cụ ánh xạ SQL (SQL mapper) chứ không hẳn là ORM, vì lập trình viên tự viết câu SQL còn nó chỉ ánh xạ kết quả sang đối tượng, không quản lý trạng thái entity; tuy vậy cả ba đều dùng được cùng Spring nên đáp án là phương án gộp. Chọn riêng "Hibernate" là bỏ sót, dù đây là provider mặc định của Spring Boot. Chọn riêng "EclipseLink" cũng bỏ sót, dù nó là bản cài đặt tham chiếu của JPA. Chọn riêng "MyBatis" còn kém hơn vì đó lại là công cụ ít giống ORM nhất trong ba.
Mở trang câu hỏi này →
AIt returns an HTML page
BIt converts the return value to JSON or XML
CIt binds request parameters
DIt sets the HTTP status code
Lời giải
Đáp án đúng: "It converts the return value to JSON or XML". Khi một phương thức handler có @ResponseBody, Spring MVC không coi giá trị trả về là tên view nữa mà đưa nó qua HttpMessageConverter phù hợp với header Accept và thư viện có trong classpath để ghi thẳng vào thân phản hồi HTTP, ví dụ đối tượng Java thành JSON nhờ Jackson hoặc thành XML nếu có bộ chuyển XML; @RestController chính là @Controller cộng @ResponseBody cho mọi phương thức. "It returns an HTML page" mô tả hành vi ngược lại, tức handler không có @ResponseBody trả về tên view để ViewResolver render template HTML. "It binds request parameters" là việc của @RequestParam, @PathVariable hay @ModelAttribute. "It sets the HTTP status code" là việc của @ResponseStatus hoặc ResponseEntity, @ResponseBody không đổi mã trạng thái.
Mở trang câu hỏi này →
AController
BModel
CView
DDAO
Lời giải
Đáp án đúng: "View". Trong mô hình MVC, View là thành phần lấy dữ liệu đã chuẩn bị sẵn và dựng thành giao diện người dùng; ở Spring MVC đó là template Thymeleaf, trang JSP hay bất kỳ cài đặt nào của giao diện View, được ViewResolver chọn ra rồi render với dữ liệu trong model để sinh HTML trả về trình duyệt. "Controller" nhận yêu cầu, gọi logic nghiệp vụ và quyết định view nào sẽ hiển thị, nhưng không tự vẽ giao diện. "Model" chỉ là nơi chứa dữ liệu chuyển sang view, không có khả năng hiển thị. "DAO" (Data Access Object, đối tượng truy cập dữ liệu) nằm ở tầng dưới cùng, đọc ghi cơ sở dữ liệu, hoàn toàn tách khỏi giao diện.
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 →
AlookupByEmailLikeIgnoreCase(String email)
BfindByEmailContainingIgnoreCase(String email)
CqueryWhereEmailContainsCaseInsensitive(String email)
DselectEmailContainsIgnoreCase(String email)
Lời giải
Đáp án đúng: "findByEmailContainingIgnoreCase(String email)". Spring Data JPA phân tích tên phương thức: tiền tố findBy mở phần điều kiện, Email là thuộc tính của entity, từ khoá Containing sinh điều kiện LIKE có ký tự đại diện ở hai đầu giá trị, còn IgnoreCase bọc cả hai vế bằng UPPER để so không phân biệt hoa thường. "lookupByEmailLikeIgnoreCase(String email)" sai vì lookup không phải tiền tố hợp lệ (chỉ có find, read, get, query, search, stream, count, exists, delete), và Like không tự thêm ký tự đại diện nên người gọi phải tự truyền dấu phần trăm. "queryWhereEmailContainsCaseInsensitive(String email)" sai vì thiếu chữ By ngăn tiền tố với điều kiện, còn Where và CaseInsensitive không phải từ khoá, nên dù Contains là đồng nghĩa của Containing thì tên vẫn không phân tích được. "selectEmailContainsIgnoreCase(String email)" sai vì select không phải tiền tố hợp lệ và cũng thiếu By, Spring Data coi cả chuỗi là tên thuộc tính không tồn tại.
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 →
48Spring Data JPA is built on top of:4 lựa chọn
ASpring MVC
BSpring Core
CJPA
DServlets
Lời giải
Đáp án đúng: "JPA". Spring Data JPA là một module của dự án Spring Data, xây trên đặc tả JPA (Jakarta Persistence API): nó không tự ánh xạ đối tượng sang bảng mà dùng EntityManager của một JPA provider như Hibernate bên dưới, rồi bổ sung các repository như JpaRepository, sinh truy vấn từ tên phương thức và @Query để bớt mã lặp. Vì thế nền móng trực tiếp mà nó dựa vào là JPA. "Spring MVC" là framework web xử lý yêu cầu HTTP; Spring Data JPA dùng được cả trong ứng dụng không có web nên không phụ thuộc vào nó. "Spring Core" cung cấp container IoC mà mọi module Spring đều cần, nên Spring Data JPA đúng là chạy trong đó, nhưng câu hỏi nhắm tới công nghệ truy cập dữ liệu mà nó trừu tượng hoá. "Servlets" là API web của Jakarta EE, không liên quan tới tầng lưu trữ.
Mở trang câu hỏi này →
AJpaRepository
BCrudService
CEntityManager
DJdbcTemplate
Lời giải
Đáp án đúng: "JpaRepository". JpaRepository là interface của Spring Data JPA, kế thừa các interface CRUD và phân trang của Spring Data, nên khi khai báo một interface mở rộng JpaRepository cho thực thể Student với khoá Long, Spring tự sinh hiện thực có sẵn save, findById, findAll, deleteById, count cùng phân trang, sắp xếp và flush. "CrudService" không phải interface có trong Spring, chỉ là tên tự đặt. "EntityManager" là API của JPA có persist, find, merge, remove, tức làm được CRUD, nhưng đó là đối tượng quản lý persistence context ở tầng thấp, không phải interface repository cung cấp sẵn thao tác CRUD theo kiểu Spring Data. "JdbcTemplate" là lớp tiện ích của Spring JDBC để chạy câu SQL tự viết, không phải interface và không có sẵn phương thức CRUD theo thực thể.
Mở trang câu hỏi này →
AsearchBy
BfindBy
CgetWhere
DqueryFor
Lời giải
Đáp án đúng: "findBy". Trong Spring Data, chỉ cần khai báo phương thức như findByLastName(String lastName) trong interface kế thừa JpaRepository, bộ phân tích tên sẽ tách tiền tố findBy, nhận LastName là thuộc tính của entity và sinh truy vấn lọc theo cột tương ứng; findBy là tiền tố thông dụng nhất và được tài liệu Spring Data dùng làm ví dụ chuẩn cho derived query (truy vấn suy từ tên phương thức). "searchBy" thực ra cũng được các phiên bản Spring Data mới chấp nhận như một đồng nghĩa, nhưng ít dùng và không phải từ khoá tiêu biểu mà câu hỏi nhắm tới. "getWhere" sai vì thiếu By: get là tiền tố hợp lệ nhưng phải viết getBy, còn Where không phải từ khoá nên tên không được phân tích. "queryFor" sai tương tự, query chỉ hợp lệ khi đi cùng By, phần For không có nghĩa trong cú pháp này.
Mở trang câu hỏi này →