Cách thêm thư viện JAR vào Maven Dependency Maven project
Add local jar to maven project
Sau đây mình sẽ hướng dẫn 2 cách thêm file jar vào Maven Dependency trong Maven project. Thông thường bạn chỉ cần tìm tên thư viện trên website mvnrepository.com là có thể copy vào file pom.xml. Nhưng nếu thư viện đó không có trên website đó thì sao? Bạn phải thêm bằng tay trên local máy tính bạn.
1- Cài đặt bằng tay file JAR vào local Maven repository
Các giải quyết đầu tiên là cài đặt bằng tay file JAR vào local Maven repository sử dụng lệnh install:install-file
Chú ý là chúng ta chưa thiết lập cụ thể groupId, artifactId, version và packaging của file JAR cần cài đặt. Để có thể dùng được thư viện JAR trong pom.xml chúng ta nên khai báo chúng.
Xong rồi! cách Cài đặt bằng tay file JAR vào local Maven repository có 1 số nhược điểm như sau:
Không được nhanh do phải làm tới 2 bước mỗi file JAR.
Vào ngày đẹp trời bạn đổi local Maven repository thì bạn phải cài đặt lại file JAR đó.
Nếu có nhiều người cùng làm việc trong Project này thì mỗi người phải cài đặt file JAR vào local Maven repository của họ.
2- Thêm trực tiếp dependency bằng cách dùng system scope
Hướng giải quyết khác, thêm trực tiếp dependency bằng cách dùng system scope. Tức bạn chỉ cần làm bước 2 trong cách Cài đặt bằng tay file JAR vào local Maven repository đồng thời tham chiếu tới đuờng dẫn đầy đủ file JAR đó.
Cân nhắc là file JAR được đặt trong <PROJECT_ROOT_FOLDER>/lib. Sau đó thêm các lệnh sau vào file pom.xml
$basedir đại diện cho thư mục gốc của project nơi có file pom.xml
Xong rồi! Cách này có vẻ nhanh hơn cách Cài đặt bằng tay file JAR vào local Maven repository nhỉ 🙂
Trên đây là 2 cách thêm file jar vào Dependency trong Maven project mà mình thấy đơn giản. Ngoài ra có thể có nhiều cách khác nữa, bạn có thể tự tìm hiểu thêm!
Bài viết này chúng ta sẽ tìm hiểu về Spring MVC và Spring Boot thuộc Spring Framework trong dự án java web.
Spring là một open source framework dành cho Java Enterprise(bạn hiểu mùa xuân cũng được 🙂 ). Core feature của Spring có thể dùng để xây dựng bất cứ Java application nào, các extensions của Spring có thể được sử dụng cho việc xây dựng web application trên nền tảng Java EE. Spring framework cũng hướng tới mục tiêu làm cho việc phát triển các ứng dụng trên nền tảng Java EE dễ dàng hơn và thúc đẩy việc lập trình tốt hơn bằng model POJO-based.
Tại sao dùng Spring Framework? Lợi ích Spring Framework là gì?
Spring framework mang lại cho chúng ta sự gọn nhẹ (lightweight), sử dụng Inversion of control (IoC) để giúp loose coupling, sử dụng Aspect oriented programming để tách biệt các thành phần business, có container với quản lý tất cả life cycle và config của các object trong application, phát triển ứng dụng đơn giản với MVC, có transaction management, cung cấp các API tiện lợi cho việc handling exception.
Spring MVC là gì?
Spring có xây dựng một cơ chế có tên Spring MVC mà ở đó có các API cho phép việc xây dựng ứng dụng web được dễ dàng hơn và chuẩn hơn. Chuẩn hơn thể hiện ở chỗ mọi thành phần được tạo ra, cài đặt và vận hành tuân theo một chuẩn thiết kế thống nhất.
Chắc các bạn thắc mắc MVC là viết tắt từ gì ?. MVC lần lượt là ba chữ cái đầu tiên của ba từ Model, View và Controller. MVC là một mô hình ứng dụng mà ở đó các thành phần được phân tách ra thành các lớp riêng biệt với các nhiệm vụ đặc trưng.
View sẽ là lớp cho các thành phần có chức năng hiển thị, giao tiếp trực tiếp với người dùng. Nhiệm vụ của các thành phần trong View là trình bày các dữ liệu từ Model đến người dùng cuối.
Model là các thành phần có khả năng lưu trữ và vận chuyển thông tin. Quá trình gửi dữ liệu vào Model sẽ được thực hiện bởi Controller.
Controller là các thành phần giúp cho việc xử lý logic các thao tác nghiệp vụ. Nhiệm vụ của Controller là lấy dữ liệu từ Model, xử lý dữ liệu, và cập nhật lại dữ liệu vào Model.
Ta cụ thể hóa ý tưởng trên vào trong trường hợp của Spring MVC. Ở đây View sẽ là các trang html hay jsp giúp cho việc hiển thị dữ liệu lên trình duyệt. Dữ liệu được lấy ra từ Model là các POJO (Plain Old Java Object) hay ta còn gọi là các Domain Object. Cụ thể hơn, nó là các đối tượng có các thuộc tính có khả năng truyền dữ liệu trong các luồng nghiệp vụ của ứng dụng. Cuối cùng là Controller, là các lớp đặc biệt, có chứa các phương thức có khả năng nhận yêu cầu, xử lý yêu cầu, cập nhật dữ liệu, và chuyển tiếp dữ liệu trong ứng dụng.
Spring Boot là một dự án phát triển bởi JAV (ngôn ngữ java) trong hệ sinh thái Spring framework. Nó giúp cho các lập trình viên chúng ta đơn giản hóa quá trình lập trình một ứng dụng với Spring, chỉ tập trung vào việc phát triển business cho ứng dụng.
Để phát triển một ứng dụng web cơ bản HelloWorld sử dụng Spring framework bạn sẽ cần ít nhất 5 công đoạn sau:
Tạo một project sử dụng Maven với các dependency cần thiết của Spring MVC và Servlet API.
Một tập tin web.xml hoặc application.properties để khai báo DispatcherServlet của Spring MVC.
Một tập tin cấu hình của Spring MVC.
Một class Controller trả về một trang “Hello World” khi có request đến.
Cuối cùng là phải có một web server dùng để triển khai ứng dụng lên chạy.
Trong các công đoạn này, chỉ có công đoạn tạo một class Controller thì có thể khác cho các ứng dụng khác nhau vì mỗi ứng dụng có một yêu cầu khác nhau. Còn các công đoạn khác thì như nhau.
Giờ đây với Spring Boot, chúng ta có thể tạo dự án Spring một cách nhanh chóng và cấu hình cũng đơn giản với Elipse + Plugin spring suite tool
Zeus Master of Olympus and Poseidon Master of Atlantis
[Cũ mà hay] Zeus Master of Olympus and Poseidon Master of Atlantis là hai bản game chiến thuật rất nổi tiếng của Impression sau thành công Ceasar và Pharaoh.
Đầu tiên, để chơi được bản mở rộng Poseidon Master of Atlantis, yêu cầu trong máy bạn phải có cài sẵn phiên bản Zeus cũ. Bạn sẽ có thể chọn chơi phiên bản Zeus hay Poseidon khi đã vào game. Tải 2 bản Link ở dưới. Theo truyền thuyết kể lại thì ngoài khơi Đại Tây Dương trước đây tồn tại một lục địa to lớn có tên là Atlantis. Do phạm phải tội vô lễ, thần Poseidon nổi giận vùi sâu Atlantic xuống lòng đại dương. Chuyến hành trình của chúng ta sẽ xoay quanh lục địa Atlantic, bắt đầu từ nơi lục địa bí ẩn này được sinh ra, phát triển hưng thịnh và suy tàn. Xây dựng một thành phố hoa lệ, thu hút một lượng lớn dân cư tứ xứ, triệu hồi thần linh, anh hùng bảo vệ lãnh thổ và tiêu diệt quái vật là những trọng trách to lớn mà bạn phải gánh vác khi hóa thân thành đại đế trong trò chơi. Bên cạnh đó, Poseidon còn có thêm rất nhiều chi tiết thú vị khi bạn tham gia vào trò chơi khám phá một trong ba cái nôi thần thoại của nhân loại (Hy Lạp, Ai Cập và Trung Quốc). Trăm công nghìn việc Có nhiều lý do khiến Poseidon đứng tách biệt với hai đàn anh của nó. Điều làm tôi ưng ý nhất là Zeus và Poseidon đã bỏ đi những thao tác điều khiển phức tạp có từ thời Caesar 3. Rõ ràng nhất là game đã giảm các cấp nhà cửa từ 20 xuống còn 6 cấp để tránh những mâu thuẫn phát sinh khi nâng cấp nhà, tiện cho việc phát triển những khu dân cư mới mà vẫn đảm bảo sự phát triển cho khu phố chính.
Cách chơi không khác trò Caesar 3 hay Emperor Kingdom. Trước hết, để cho dân chúng “an cư lạc nghiệp” giúp bạn rảnh tay quản lý những việc khác, cơ bản chỉ cần cung cấp cho người dân ba nguồn thiết yếu: lương thực để ăn, lông cừu để giữ ấm và dầu ôliu để thắp sáng. Văn hoá trong Poseidon cũng có nhiều điểm khác biệt so với Zeus. Nhà sản xuất đã bỏ qua những công trình như nhà hát kịch nghệ, sân vận động mà thay vào đó là những công trình mang đậm tính khoa học như phòng thí nghiệm, viện bảo tàng… Như vậy cũng khá hợp lý vì theo những câu chuyện truyền thuyết thì người dân của lục địa Atlantic là những người say mê khoa học. Riêng về giải trí, thành phố của bạn sẽ có một môn thể thao hấp dẫn là đua ngựa. Ngựa bây giờ không chỉ được cung cấp để trở thành ngựa chiến trên sa trường mà còn được huấn luyện thành những con tuấn mã trên đường đua. Sức mạnh thần thánh vô biên
Nếu so sánh với Caesar 3 hay Pharaoh thì quả thật Zeus đã tạo một bước ngoặt lớn khi sinh ra hình ảnh những vị thần sống động. Trong Caesar, bạn chỉ đơn giản xây một đền thờ nhỏ xíu và làm vui lòng thần linh bằng cách tổ chức lễ hội linh đình và thần linh sẽ thể hiện sự ban phước hoặc phẫn nộ qua những tia sét vô cảm. Trong Pharaoh, bạn mất hàng giờ để xây dựng những toà kim tự tháp vĩ đại, đẹp thật đấy nhưng nhìn chung không xứng đáng với công sức và thời gian bạn bỏ ra. Với Poseidon thì khác, hệ thống thần linh trở nên linh hoạt và quan trọng không chỉ trong đời sống tín ngưỡng mà còn ảnh hưởng sâu sắc đến mọi mặt của thành phố, từ giao thương, trồng trọt chăn nuôi đến những chuyện đại sự như chống xâm lăng hay hành quân chinh phạt. Do đó, trước khi quyết định một việc gì, khôn ngoan nhất là bạn nên tham khảo ý kiến của thần linh hay nếu phải xây dựng từ đầu, bạn nên chừa chỗ để xây cho các thần một đền thờ thật nguy nga, lộng lẫy, còn hiệu quả ra sao thì hãy tự mình khám phá nhé.
Việc lựa chọn thần linh cho mình cũng không phải là điều dễ dàng. Chỉ riêng bản Zeus số lượng thần linh trong game đã là 11. Khi bước qua bản Poseidon, trò chơi được bổ sung thêm hai vị thần mới là Hera và Atlas nâng tổng số lên 13. Bạn thấy đấy, con số này hơn gấp đôi con số 5 vị thần trong Caesar và Pharaoh. Mỗi một thành phố chỉ có thể thờ phụng tối đa là ba vị thần cho nên hãy khéo léo xây dựng vừa đủ không gây lãng phí tài nguyên và nhân lực. Chọn lựa như thế nào? Ví dụ, thành phố bạn có nhiều đất nông nghiệp thì nên chọn Demeter, bà ta sẽ phù phép cho sản lượng lương thực tăng vọt. Nếu thành phố có nhiều mối giao thương thì chọn Hermes để tăng tốc độ và chu kỳ di chuyển của thương nhân, và nếu bạn có biển thì xây thêm đền thờ thần Poseidon để phù hộ cho tàu thuyền không bị đắm cũng như tiêu diệt quân xâm lăng bằng đường biển. Bạn có thể tham khảo thêm chức năng của mỗi vị thần trong mục Helps của trò chơi. Kết Luận
Tóm lại, Poseidon là một game xây dựng rất hay với đủ mọi thứ có thể để bạn “động não”: nhà cửa, lương thực, dân chúng, thần thánh và quái vật… Không biết các bạn nghĩ sao còn bản thân tôi thấy Zeus và Poseidon là trò chơi xây dựng hay nhất trong số seri game xây dựng thành phố của hãng Impression Games.
Cấu hình
Minimum System Requirements
OS: Windows 2000/XP/7/8
Processor: 1.3 GHz
Memory: 256 Mb
Hard Drive: 2 Gb free
Video Memory: 64 Mb
Sound Card: DirectX Compatible
DirectX: 9.0
Nguồn:Sưu tầm
Video hướng dẫn
Download Zeus Master of Olympus and Poseidon Master of Atlantis
Hướng dẫn quan hệ nhiều nhiều (many to many) cột mở rộng hibernate jpa với Spring Boot Project
Tạo bảng trong cơ sở dữ liệu
Trong bài này chúng ta sẽ có 3 bảng trong cơ sở dữ liệu: book, publisher, book_publisher. Vì thế bên Java tương ứng sẽ có 3 entity là Book.java, Publisher.java và BookPublisher.java
Lược đồ cơ sở dữ liệu như bạn thấy, trong bảng phụ ngoài 2 khóa chính cũng là 2 khóa ngoại như bài trước thì còn có 1 field là published_date
Mapping a many-to-many extra columns relationship with Spring Boot, Spring Data JPA and MySQL.
Database many-to-many extra columns code mysql:
CREATE DATABASE IF NOT EXISTS `jpa_manytomany_extracolumns` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `jpa_manytomany_extracolumns`;
-- -- Table structure for table `book` --
DROP TABLE IF EXISTS `book`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `book` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */;
-- -- Table structure for table `publisher` --
DROP TABLE IF EXISTS `publisher`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `publisher` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8;
-- -- Table structure for table `book_publisher` --
DROP TABLE IF EXISTS `book_publisher`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `book_publisher` ( `book_id` int(10) unsigned NOT NULL, `publisher_id` int(10) unsigned NOT NULL, `published_date` datetime DEFAULT NULL, PRIMARY KEY (`book_id`,`publisher_id`), KEY `fk_bookpublisher_publisher_idx` (`publisher_id`), CONSTRAINT `fk_bookpublisher_book` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_bookpublisher_publisher` FOREIGN KEY (`publisher_id`) REFERENCES `publisher` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */;
Cấu trúc project spring boot
Vào phần chính nào, mình dùng Eclipse + plugin Spring suite Tool để tạo project spring boot nhanh nhất.
Tạo project Spring Starter Project như hình
Sau khi tạo xong bạn sẽ thấy có class Manytomany1Application.java và file pom.xml
@SpringBootApplication public class Manytomany2Application public static void main(String[] args) SpringApplication.run(Manytomany2Application.class, args);
@Transactional @Test public void contextLoads() Book bookA = new Book("Book A"); Book bookB = new Book("Book B");
Publisher publisherA = new Publisher("Publisher A"); Publisher publisherB = new Publisher("Publisher B");
BookPublisher bookPublisher = new BookPublisher(); bookPublisher.setBook(bookA); bookPublisher.setPublisher(publisherA); bookPublisher.setPublishedDate(new Date()); bookA.getBookPublishers().add(bookPublisher);
BookPublisher bookPublisher2 = new BookPublisher(); bookPublisher2.setBook(bookA); bookPublisher2.setPublisher(publisherB); bookPublisher2.setPublishedDate(new Date()); bookA.getBookPublishers().add(bookPublisher2);
BookPublisher bookPublisher3 = new BookPublisher(); bookPublisher3.setBook(bookB); bookPublisher3.setPublisher(publisherB); bookPublisher3.setPublishedDate(new Date()); bookB.getBookPublishers().add(bookPublisher3);
publisherRepository.save(publisherA); publisherRepository.save(publisherB); bookRepository.save(bookA); bookRepository.save(bookB); // test System.out.println(bookA.getBookPublishers().size());
Kết quả chạy, mình chỉ copy phần chính thôi!
Hibernate: insert into publisher (name) values (?) Hibernate: insert into publisher (name) values (?) Hibernate: insert into book (name) values (?) Hibernate: insert into book_publisher (published_date, publisher_id, book_id) values (?, ?, ?) Hibernate: insert into book_publisher (published_date, publisher_id, book_id) values (?, ?, ?) Hibernate: insert into book (name) values (?) 2
Kết quả là trong bảng Book và Publisher sẽ có 2 Book và 2 Publisher tương ứng. Còn trong bảng book_publisher sẽ có 3 dòng trong đó có 1 book sẽ có 2 publisher và 1 book sẽ có 1 publisher.
Keil C là một phần mềm hỗ trợ cho người dùng trong việc lập trình cho vi điều khiển các dòng khác nhau (Atmel, AVR, PIC..). Keil C giúp người dùng soạn thảo và biên dịch chương trình C hay cả ASM thành ngôn ngữ máy để nạp vào vi điều khiển giúp chúng ta tương tác giữa vi điều khiển và người lập trình.
Download KEIL C UVISION 4 and KEIL C UVISION 5
Hôm nay, mình xin giới thiệu đến các bạn các bước cài đặt phần mềm lập trình cho ARM Keil C V5. Đầu tiên các bạn tải phần mềm Keil C V5 Full crack tại đây. (Keil C – V4 làm tương tự nhé).
KEIL C UVISION v4 v5 FULL CRACK
Hướng dẫn cài đặt Keil mdk ARM
Sau khi các bạn download phần mềm Keil C về, các bạn giải nén sẽ ra thư mục KeilC V5.
Trong thư mục ARM chứa bộ cài phần mềm Keil: mdk511.exe và c51v901.exe. Vui lòng chọn 1 trong 2 để cài đặt sau đó chạy keygen để crack. Chạy file mdk511.exe
Hộp thoại cài đặt xuất hiện, các bạn chọn Next.
Tick vào ô “I agree to all the terms of the preceding License Agreement”, sau đó chọn Next.
Tiếp theo, các bạn chọn đường dẫn lưu thư mục cài đặt, sau đó chọn Next.
Tiếp theo, các bạn điền đầy đủ thông tin, và chọn Next.
Sau đó các bạn chờ để máy tự động tiến hành cài đặt.
Sau khi máy cài đặt xong, các bạn chọn Finish.
Sau đó, hộp thoại Pack Installer xuất hiện, các bạn nhấn OK.
Trong hộp thoại Pack Installer, các bạn install dòng chip các bạn đang sử dụng.
Sau khi quá trình Install kết thúc, các bạn tắt hộp thoại Pack Installer.
Tiến hành crack
Các bạn chạy chương trình Keil uVision 5 vừa cài đặt ở dạng Run as Admin, sau đó vào File License Management.
Hộp thoại License Management xuất hiện, các bạn copy mã CID.
Sau đó, các bạn vào thư mục Crack /keygen, Click chạy file keygen.exe và làm theo các bước hướng dẫn trong hình sau.
Tiếp theo, quay trở lại hộp thoại License Management , và làm theo hướng dẫn như dưới đây.
Như vậy là đã xong các bước cài đặt và crack thành công phần mềm Keil C V5 cho 8051 & ARM.
Proteus Pro 8.6 Full Portable Phần mềm giả lập mạch điện tử
Proteus Pro 8.6 là phần mềm cho phép giả lập mô phỏng hoạt động của mạch điện tử bao gồm phần thiết kế mạch và viết chương trình điều khiển.
Proteus Pro 8.6 là phần mềm cho phép giả lập mô phỏng hoạt động của mạch điện tử bao gồm phần thiết kế mạch và viết chương trình điều khiển cho các họ vi điều khiển như MCS-51, PIC, AVR…Proteus là phần mềm mô phỏng mạch điện tử của Lancenter Electronics, mô phỏng cho hầu hết các linh kiện điện tử thông dụng, đặc biệt hỗ trợ cho cả các MCU như PIC, 8051, AVR, Motorola.
Phần mềm Proteus Pro 8.6 bao gồm 2 chương trình: ISIS cho phép mô phỏng mạch và ARES dùng để vẽ mạch in. Proteus là công cụ mô phỏng cho các loại Vi Điều Khiển khá tốt, nó hỗ trợ các dòng VĐK 8051, AVR, PIC, dsPIC, ARM … các giao tiếp I2C, SPI, CAN, USB, Ethenet,… ngoài ra còn mô phỏng các mạch số, mạch tương tự một cách hiệu quả.
Proteus Pro 8.6 là một phần mềm không còn xa lạ gì cho những bạn là dân Kỹ Thuật. Nó giúp bạn có thể mô phỏng mạch điện tử một cách chính xác nhất so với các chương trình tương tự. Bạn có thể thiết kế mạch, nguyên lý hoạt động, chạy thử nghiệm, thiết kế các mạch in với giao diện cực kì trực quan, thao tác dễ dàng chỉ việc kéo thả các linh kiện, kéo thả kết nối các chân kết nối với nhau một cách nhanh chóng.
Các phần mềm trong bộ Proteus Professional 8.6
ISIS Schematic Capture- ISIS đã được nghiên cứu và phát triển trong hơn 12 năm và có hơn 12000 người dùng trên khắp thế giới. Sức mạnh của nó là có thể mô phỏng hoạt động của các hệ vi điều khiển mà không cần thêm phần mềm phụ trợ nào. Sau đó, phần mềm ISIS có thể xuất file sang ARES hoặc các phần mềm vẽ mạch in khác.Trong lĩnh vực giáo dục, ISIS có ưu điểm là hình ảnh mạch điện đẹp, cho phép ta tùy chọn đường nét, màu sắc mạch điện, cũng như thiết kế theo các mạch mẫu (templates).Những khả năng khác của ISIS là:
Tự động sắp xếp đường mạch và vẽ điểm giao đường mạch.
Chọn đối tượng và thiết lập thông số cho đối tượng dễ dàng
Xuất file thống kê linh kiện cho mạch
Xuất ra file Netlist tương thích với các chương trình làm mạch in thông dụng.
Đối với người thiết kế mạch chuyên nghiệp, ISIS tích hợp nhiều công cụ giúp cho việc quản lý mạch điện lớn, mạch điện có thể lên đến hàng ngàn linh kiện.
Thiết kế theo cấu trúc (hierachical design)
Khả năng tự động đánh số linh kiện.
Download Proteus Pro 8 gồm 2 bản: Proteus 8 Pro Full và Proteus Pro 8.6 SP2 Build 23525 Portable (nên cài) và hướng dẫn dùng phần mềm Proteus
Hướng dẫn tạo quan hệ liên kết nhiều nhiều (many to many) trong hibernate spring boot không tạo bản phụ
Many To Many Relationship Mapping with Spring Boot
Trong bài này mình sẽ hướng dẫn dùng annotation manytomany không thêm bảng phụ (trung gian) trong hibernate + spring boot + mysql
Hướng dẫn dùng annotation manytomany với bảng phụ (trung gian) trong hibernate + spring boot + mysql – đang update 🙂
Quan Hệ Liên Kết Giữa Các Đối Tượng Trong Hibernate
Association Mappings
Sau đây là bốn cách thức biểu diễn các mối quan hệ giữa các đối tượng, nó được biểu diễn theo hướng 1 chiều hoặc 2 chiều.
MAPPING TYPE
DESCRIPTION
Many-to-One
Mapping mối quan hệ nhiều – một trong Hibernate
One-to-One
Mapping mối quan hệ một – một trong Hibernate
One-to-Many
Mapping mối quan hệ một – nhiều trong Hibernate
Many-to-Many
Mapping mối quan hệ nhiều – nhiều trong Hibernate
Hướng dẫn quan hệ nhiều nhiều (many to many) hibernate jpa với Spring Boot Project
Các công nghệ sử dụng:
Spring Boot
MySQL
Hibernate JPA (Spring Data)
Các công cụ phần mềm cần:
JDK 1.8 or later
Maven 3 or later
MySQL Server 5.6 or later
Eclipse + Plugin spring suite tool
Tạo bảng trong cơ sở dữ liệu
Trong bài này chúng ta sẽ có 3 bảng trong cơ sở dữ liệu: book, publisher, book_publisher. Nhưng bên java chúng ta chỉ cần 2 entity là book.java và publisher.java thôi.
Lược đồ cơ sở dữ liệu như bạn thấy bảng phụ chỉ có 2 khóa chính của 2 bản chính. Nếu thêm 1 field vào bản phụ này thì sao? Khi đó bạn không thể làm theo hướng dẫn này mà bạn phải làm theo Hướng dẫn dùng annotation manytomany với bảng phụ (trung gian) trong hibernate + spring boot + mysql
Database jpa_manytomany code:
CREATE DATABASE IF NOT EXISTS `jpa_manytomany`; USE `jpa_manytomany`;
DROP TABLE IF EXISTS `book`; CREATE TABLE `book` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `publisher`; CREATE TABLE `publisher` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS `book_publisher`; CREATE TABLE `book_publisher` ( `book_id` int(10) unsigned NOT NULL, `publisher_id` int(10) unsigned NOT NULL, PRIMARY KEY (`book_id`,`publisher_id`), KEY `fk_bookpublisher_publisher_idx` (`publisher_id`), CONSTRAINT `fk_bookpublisher_book` FOREIGN KEY (`book_id`) REFERENCES `book` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, CONSTRAINT `fk_bookpublisher_publisher` FOREIGN KEY (`publisher_id`) REFERENCES `publisher` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Cấu trúc project spring boot
Vào phần chính nào, mình dùng Eclipse + plugin Spring suite Tool để tạo project spring boot nhanh nhất.
Tạo project Spring Starter Project như hình
Sau đó thiết lập project
Sau khi tạo xong bạn sẽ thấy có class Manytomany1Application.java và file pom.xml
@Id @GeneratedValue(strategy = GenerationType.AUTO) public int getId() return id;
public void setId(int id) this.id = id;
public String getName() return name;
public void setName(String name) this.name = name;
@ManyToMany(mappedBy = "publishers") public Set<Book> getBooks() return books;
public void setBooks(Set<Book> books) this.books = books;
Mình sẽ giải thích một chút nhá!
@Entity khai báo đây là thực thể tương ứng với bảng trong cơ sở dữ liệu.
@Table dùng để maps các class java với bảng trong cơ sở dữ liệu theo tên. Ví dụ:
@Table(name = "bai") public class Bai
Nếu bạn không khai báo tên trong @Table thì nó ngầm định bạn dùng tên bảng giống tên class.
@Id khai báo này cho biết thuộc tính này là khóa chính.
@Column dùng để maps với các field trong bảng cơ sở dữ liệu. Nếu bạn để trống, không khai báo thì nó ngầm định tên thuộc tính trong class tương ứng với tên field trong bảng.
@ManyToMany khai báo quan hệ many-to-many giữa 2 thực thể. Ví dụ cụ thể: quan hệ nhiều nhiều giữa book và publisher, nên trong class Book sẽ có danh sách các publisher và ngược lại.
@JoinTable thường đi chung với khai báo quan hệ liên kết Association Mappings. Được hiểu là kết với bảng nào. Ví dụ bảng book sẽ kết với bảng book_publisher qua cột ( @JoinColumn ) book_id và tham chiếu cột còn lại là: publisher_id
mappedBy được dùng bên bảng còn lại là publisher nói rằng sẽ maps với thuộc tính publishers bên bảng book. Ví dụ bên dưới!
@ManyToMany(mappedBy = "publishers") public Set<Book> getBooks() return books;
Tạo Spring Data JPA Repository
Sau khi tạo xong các class trong Model, chúng ta sẽ tạo Repository cho các class tương ứng. Ở đây mình làm nhanh để tập trung vào phần hibernate many to many nên không có class Service hay Implement nhá!
Spring Data JPA chứa một số kho tích hợp để thực hiện một số chức năng phổ biến để làm việc nhanh với cơ sở dữ liệu như: findOne, findAll, save, …
Tạo class BookRepository.java trong package com.qlam.demo.repository
@Test @Transactional public void contextLoads() // save a couple of books Publisher publisherA = new Publisher("Publisher A"); Publisher publisherB = new Publisher("Publisher B"); Publisher publisherC = new Publisher("Publisher C");
bookRepository.save(new HashSet<Book>()
add(new Book("Book A", new HashSet<Publisher>()
add(publisherA); add(publisherB);
));
add(new Book("Book B", new HashSet<Publisher>()
add(publisherA); add(publisherC);
));
);
// fetch all books for (Book book : bookRepository.findAll()) logger.info("\n" + book.toString());
// save a couple of publishers Book bookA = new Book("Book A"); Book bookB = new Book("Book B");
publisherRepository.save(new HashSet<Publisher>()
add(new Publisher("Publisher A", new HashSet<Book>()
add(bookA); add(bookB);
));
add(new Publisher("Publisher B", new HashSet<Book>()
add(bookA); add(bookB);
));
);
// fetch all publishers for (Publisher publisher : publisherRepository.findAll()) logger.info("\n"+publisher.toString());
Để chạy project spring boot bạn chọn theo hình dưới!
Kết quả chạy, mình chỉ copy phần chính thôi!
2017-10-02 15:17:52.498 INFO 11172 --- [ main] c.qlam.demo.Manytomany1ApplicationTests : Started Manytomany1ApplicationTests in 7.008 seconds (JVM running for 8.777) 2017-10-02 15:17:52.551 INFO 11172 --- [ main] o.s.t.c.transaction.TransactionContext : Began transaction (1) for test context [DefaultTestContext@2698dc7 testClass = Manytomany1ApplicationTests, testInstance = com.qlam.demo.Manytomany1ApplicationTests@6c0b51da, testMethod = contextLoads@Manytomany1ApplicationTests, testException = [null], mergedContextConfiguration = [WebMergedContextConfiguration@43d7741f testClass = Manytomany1ApplicationTests, locations = '', classes = 'class com.qlam.demo.Manytomany1Application', contextInitializerClasses = '[]', activeProfiles = '', propertySourceLocations = '', propertySourceProperties = 'org.springframework.boot.test.context.SpringBootTestContextBootstrapper=true', contextCustomizers = set[org.springframework.boot.test.context.SpringBootTestContextCustomizer@3bfdc050, org.springframework.boot.test.context.filter.ExcludeFilterContextCustomizer@5c3bd550, org.springframework.boot.test.json.DuplicateJsonObjectContextCustomizerFactory$DuplicateJsonObjectContextCustomizer@6a4f787b, org.springframework.boot.test.mock.mockito.MockitoContextCustomizer@0, org.springframework.boot.test.autoconfigure.properties.PropertyMappingContextCustomizer@0, org.springframework.boot.test.autoconfigure.web.servlet.WebDriverContextCustomizerFactory$Customizer@3fee9989], resourceBasePath = 'src/main/webapp', contextLoader = 'org.springframework.boot.test.context.SpringBootContextLoader', parent = [null]]]; transaction manager [org.springframework.orm.jpa.JpaTransactionManager@5b0dbfb]; rollback [true] Hibernate: insert into book (name) values (?) Hibernate: insert into publisher (name) values (?) Hibernate: insert into publisher (name) values (?) Hibernate: insert into book (name) values (?) Hibernate: insert into publisher (name) values (?) 2017-10-02 15:17:53.386 INFO 11172 --- [ main] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactory Hibernate: select book0_.id as id1_0_, book0_.name as name2_0_ from book book0_ Hibernate: select publishers0_.book_id as book_id1_1_0_, publishers0_.publisher_id as publishe2_1_0_, publisher1_.id as id1_2_1_, publisher1_.name as name2_2_1_ from book_publisher publishers0_ inner join publisher publisher1_ on publishers0_.publisher_id=publisher1_.id where publishers0_.book_id=? 2017-10-02 15:17:53.887 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application : Book [id=15, name='Book B'] Publisher[id=19, name='Publisher C'] Publisher[id=20, name='Publisher A']
Hibernate: select publishers0_.book_id as book_id1_1_0_, publishers0_.publisher_id as publishe2_1_0_, publisher1_.id as id1_2_1_, publisher1_.name as name2_2_1_ from book_publisher publishers0_ inner join publisher publisher1_ on publishers0_.publisher_id=publisher1_.id where publishers0_.book_id=? 2017-10-02 15:17:53.900 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application : Book [id=16, name='Book A'] Publisher[id=21, name='Publisher B'] Publisher[id=20, name='Publisher A']
2017-10-02 15:17:53.900 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application : Book [id=17, name='Book A'] Publisher[id=22, name='Publisher B'] Publisher[id=23, name='Publisher A']
2017-10-02 15:17:53.901 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application : Book [id=18, name='Book B'] Publisher[id=24, name='Publisher C'] Publisher[id=23, name='Publisher A']
Hibernate: insert into publisher (name) values (?) Hibernate: insert into publisher (name) values (?) Hibernate: select publisher0_.id as id1_2_, publisher0_.name as name2_2_ from publisher publisher0_ 2017-10-02 15:17:53.925 INFO 11172 --- [ main] com.qlam.demo.Manytomany1Application : com.qlam.demo.model.Publisher@79ab97fd
Video chi tiết Hướng dẫn annotation many to many Hibernate Spring Boot không bản phụ
Xong rồi, qua bài Hướng dẫn tạo quan hệ liên kết nhiều nhiều (many to many) trong hibernate spring boot không tạo bản phụ bạn đã biết cách dùng project spring boot với annotation manytomany trong hibernate. Trong bài tiếp theo mình sẽ Hướng dẫn dùng annotation manytomany với bảng phụ (trung gian) trong hibernate + spring boot + mysql – đang update!
Hướng dẫn Hibernate Query Language (HQL) qua 14 ví dụ
Hibernate Query Language (HQL) Example
Hibernate ORM framework cung cấp ngôn ngữ truy vấn gọi là Hibernate Query Language viết tắt là HQL. Nó rất mạnh mẽ và linh hoạt và có các đặc điểm sau:
Tương tự như SQL: Cú pháp của HQL rất giống với SQL chuẩn. Nếu bạn quen thuộc với SQL thì viết HQL sẽ khá dễ dàng: từ SELECT, FROM, ORDER BY đến các biểu thức số học và các hàm tổng hợp, vv
Hoàn toàn hướng đối tượng: HQL không sử dụng tên thật của bảng và cột trong cơ sở dữ liệu. Nó sử dụng tên lớp và tên thuộc tính thay thế. HQL có thể hiểu được thừa kế, đa hình và liên kết.
Không phân biệt chữ hoa chữ thường cho các từ khóa (keywords): Điều đó có nghĩa là SELECT, select, Select là như nhau.
Phân biệt chữ hoa chữ thường cho các lớp và thuộc tính của Java: HQL xem xét các trường hợp nhạy cảm cho các lớp Java và các thuộc tính của chúng, nghĩa là Person và person là hai đối tượng khác nhau.
Trong bài này, mình sẽ Hướng dẫn Hibernate Query Language (HQL) qua 14 ví dụ để thực hiện các truy vấn cơ bản (CRUD) cũng như các ứng dụng phổ biến khác. Lược đồ sau minh hoạ mối quan hệ của các bảng được sử dụng trong các ví dụ của hướng dẫn này:
Và đây là các lớp model đã map với JPA annotations:
@Entity @Table(name = "ORDERS") public class Order private int id; private String customerName; private Date purchaseDate; private float amount; private Product product;
@Id @Column(name = "ORDER_ID") @GeneratedValue public int getId() return id;
public void setId(int id) this.id = id;
@Column(name = "CUSTOMER_NAME") public String getCustomerName() return customerName;
@Column(name = "PURCHASE_DATE") @Temporal(TemporalType.DATE) public Date getPurchaseDate() return purchaseDate;
@ManyToOne @JoinColumn(name = "PRODUCT_ID") public Product getProduct() return product;
// other getters and setters
Hibernate Query Language (HQL) Example
Các ví dụ sắp tới được cung cấp dựa trên giả định rằng SessionFactory Hibernate được mở ra và một giao dịch(Transaction) đã được bắt đầu. Bạn có thể tìm hiểu thêm về cách lấy SessionFactory và bắt đầu một giao dịch trong hướng dẫn: Xây dựng Hibernate SessionFactory từ Service Registry. (updating)
1. Cách thực thi(execute) HQL trong Hibernate
Thực thi câu lệnh hql qua các bước dưới đây:
Viết câu lệnh HQL:
String hql = "Your Query Goes Here";
Tạo câu truy vấn Query từ phiên làm việc Session:
Query query = session.createQuery(hql);
Thực thi query có 2 dạng: là bạn muốn thực thi dạng xem danh sách listing hay thực thi dạng cập nhật:
Listing query (SELECT):
List listResult = query.list();
Update query (INSERT, UPDATE, DELETE):
int rowsAffected = query.executeUpdate();
Kết quả trả về từ câu truy vấn: phụ thuộc vào dạng truy vấn mà Hibernate trả về các kiểu kết quả khác nhau. Ví dụ:
Select query một đối tượng sẽ trả về một danh sách các đối tượng đó.
Join query trả về danh sách mảng Objects mà các bảng được kết với nhau(xem mỗi bảng là 1 object). Điều này cũng áp dụng cho các truy vấn sử dụng các hàm tổng hợp (count, sum, avg, etc).
Bây giờ chúng ta cùng vào các ví dụ chi tiết của Hướng dẫn Hibernate Query Language (HQL) qua ví dụ !
2. Ví dụ List Query
Đoạn mã sau đây thực thi một truy vấn mà kết quả trả về là danh sách Category:
for (Product aProduct : listProducts) System.out.println(aProduct.getName());
Điều thú vị ở đây là Hibernate tự động tạo truy vấn JOIN giữa bảng Product và Category một cách lặng im. Như lúc đầu mình đã nói HQL hoàn toàn hướng đối tượng và nó thể hiện rõ ở đây. Vì vậy, chúng ta không phải sử dụng từ khóa JOIN ở câu này:
String hql = "from Product where category.name = 'Computer'";
4. Dùng tham số cho câu truy vấn (Named Parameters)
Bạn có thể dùng tham số cho câu truy vấn bằng cách sử dụng dấu hai chấm trước tên tham số, ví dụ :id cho biết một trình giữ chỗ cho một tham số có tên id. Ví dụ sau minh họa cách viết và thực hiện một truy vấn bằng cách sử dụng các tham số được đặt tên:
String hql = "from Product where description like :keyword";
for (Product aProduct : listProducts) System.out.println(aProduct.getName());
Các câu lệnh Hibernate Query Language(HQL) ở trên cho kết quả là tất cả các sản phẩm có mô tả chứa từ khoá được chỉ định(dòng 1). Sau đó sử dụng phương thức setParameter (name, value) để thiết lập giá trị thực cho tham số được đặt tên.(dòng 5)
Lưu ý rằng chúng ta muốn thực hiện một tìm kiếm LIKE để các dấu phần trăm phải được sử dụng bên ngoài chuỗi truy vấn, không giống như SQL truyền thống.
5. Ví dụ Insert – Select Query
HQL không hỗ trợ câu lệnh INSERT thông thường (bạn biết tại sao – vì phương thức session.save (Object) thực hiện nó rất tốt rồi). Vì vậy, chúng ta chỉ có thể viết INSERT … SELECT truy vấn trong HQL. Đoạn mã sau thực hiện truy vấn chèn tất cả các dòng dữ liệu từ bảng Category vào bảng OldCategory:
String hql = "insert into Category (id, name)" + " select id, name from OldCategory";
Query query = session.createQuery(hql);
int rowsAffected = query.executeUpdate(); if (rowsAffected > 0) System.out.println(rowsAffected + "(s) were inserted");
Lưu ý rằng HQL là hướng đối tượng, vì vậy Category và OldCategory phải được ánh xạ các tên lớp (không phải tên bảng thật).
6. Ví dụ Update Query
Truy vấn UPDATE tương tự như SQL. Ví dụ sau chạy truy vấn cập nhật giá cho một sản phẩm cụ thể:
String hql = "update Product set price = :price where id = :id";
Một tính năng hay của Hibernate đó là nó có thể kiểm soát tham số để tạo ra kết quả SQL cho phù hợp. Nên việc dùng tham số date time trong HQL cực dễ dàng, ví dụ:
String hql = "from Order where purchaseDate >= :beginDate and purchaseDate <= :endDate";
Query query = session.createQuery(hql);
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); Date beginDate = dateFormatter.parse("2014-11-01");
Đoạn truy vấn trên cho kết quả các order nào có ngày mua nằm trong phạm vi ngày tháng năm.
13. Dùng Expressions trong Query
Các expressions dùng trong mệnh đề WHERE, HQL hỗ trợ tất cả các toán tử toán học tương tự như SQL bao gồm:
mathematical operators: +, -, *, /
binary comparison operators: =, >=, <=, <>, !=, like
logical operators: and, or, not
etc
Xem đầy đủ hơn tại trang chủ của Hibernate, click here.
Ví dụ, câu truy vấn dưới đây trả về các sản phẩm có giá trong phạm vi 500$ tới 1000$
from Product where price >= 500 and price <= 1000
14. Dùng Aggregate Functions trong Query
HQL hỗ trợ các hàm aggregate sau:
avg(…), sum(…), min(…), max(…)
count(*)
count(…), count(distinct…), count(all…)
Ví dụ, câu truy vấn dưới đây đếm tất cả các sản phẩm:
select count(name) from Product
Và dưới đây là toàn bộ code bao gồm cách lấy kết quả:
String hql = "select count(name) from Product"; Query query = session.createQuery(hql); List listResult = query.list(); Number number = (Number) listResult.get(0); System.out.println(number.intValue());
XONG! Qua bài Hướng dẫn Hibernate Query Language (HQL) qua ví dụ, bạn đã biết được các kiến thức cơ bản của Hibernate Query Language (HQL). Giờ đây bạn có thể truy vấn HQL dễ dàng hơn bao giờ hết!