Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

Làm việc với JPA trong NetBean 6.1

1. Introduction

Trong ví dụ này, chúng ta cùng đề cập đến Java Persistence API (JPA) trong NetBeans 6.1 với 1 project kiểu java application. Ở đây chúng ta không nói đến lý thuyết của JPA, vần đền này sẽ được nói trong 1 bài khác hoặc chúng ta có thể trực tiếp đọc trên internet. Ở đây chúng ta nói nhiều đến làm thế nào để thao tác với JPA trên NetBean.

Phần mềm yêu cầu:

  • NetBeans IDE 6.1
  • JDK version 5.0 hoặc 6.0
  • MySql 5.0

2. Tạo database trong MySql 5.0

ta tạo 1 database trong MySQL5.0 với tên jpaDB. Bạn có thể chạy các lệnh sau MySQL command promt:


CREATE DATABASE jpaDB;

GRANT ALL ON jpaDB.* TO jpaDB@”%” IDENTIFIED BY “jpaDB”;
GRANT ALL ON jpaDB.* TO jpaDB@”localhost” IDENTIFIED BY “jpaDB”;

USE jpaDB;

3.Tạo kết nối đến MySQL database trong NetBeans IDE 6.1

Netbean6.1 có sẵn driver kết nối đến MySQL, bạn làm theo các bước sau để kết nối đến MySQL trong NetBean

a. Nhấn Ctrl-5 để mở của sổ Service rôi mở rộng phần database như hình
http://www.javabeat.net/articles/images/2008/07/services_database.png
b. Nhấn chuột phải lên MySQL Server, chọn properties, xuất hiện cửa sổ như hình
http://www.javabeat.net/articles/images/2008/07/MySQLServerproperties.png

c. Thông thường các thông số đã có như hình, nếu chưa thì chúng ta nhập cho đủ.

Chú ý: Bạn phải đảm bảo rằng MySQL đã được chạy trên máy tính của bạn nếu không chúng ta sẽ không thể kết nối được đến nó.

d. Sau khi starting Database Server trên máy của bạn, start MySQL Database Server trong NetBean IDE bằng cách nhấn phải chuột lên mục MySQL Server rồi chọn Start.

e. Bây giờ bạn mở rộng mục MySQL Server bạn sẽ thấy các database được hiển thị như hình sau
http://www.javabeat.net/articles/images/2008/07/expand.png

f. Nhấn phải chuột lên database của chúng ta, chọn connect, một của sổ xuất hiện yêu cầu bạn nhập các thông tin
http://www.javabeat.net/articles/images/2008/07/newDatabaseConnectionDialog.png
Nhấn OK khi mọi việc sẵn sàng. Bạn sẽ thấy database xuất hiện trên cửa sổ service. Nhấn chuột phải lên database vừa tạo trong của sổ service, chọn connect

g. Bây giờ chúng ta bắt đầu tạo table cho database.Nhấn phải chuột lên mục Tables, chọn Create Table như hình
http://www.javabeat.net/articles/images/2008/07/createTableWindowSelection.png

một cửa sổ xuất hiện và chúng ta dùng nó để tạo 1 bảng có tên users như hình
http://www.javabeat.net/articles/images/2008/07/createTableDialog.png
Kết quả trong cửa sổ Service

http://www.javabeat.net/articles/images/2008/07/userTableView.png

4. Tạo JavaApplication trong NetBeans 6.1

bây giờ chúng ta tạo 1 java application trong NetBean, đặt tên cho project là MyJPAApplication

Tiếp theo chúng ta tạo 1 lớp Entity ánh xạ vào bảng User
http://www.javabeat.net/articles/images/2008/07/selectEntityClassMenu.png
Chọn database như hình sau
http://www.javabeat.net/articles/images/2008/07/newEntityClassDatabaseWiz1.png
Bạn có thể xem được danh sách các bảng của database trong menu Available Tables. Chọn bảng User rồi nhấn nút Add để chuyển bảng đang chọn sang danh sách “Selected Tables”.
http://www.javabeat.net/articles/images/2008/07/newEntityClassDatabaseWiz2Addtable.png
Đổi tên lớp thành UserGenEntity rồi nhấn nút “Create Persistence Unit” như hình
http://www.javabeat.net/articles/images/2008/07/newEntityClassDatabaseWiz3ChangeEntityClassName.png
Trong wizard “Create Persistant Unit”, đổi tùy chọn “Table Generation Strategy” thành Create
http://www.javabeat.net/articles/images/2008/07/createPersistantUnit.png
Ta được như hình sau:
http://www.javabeat.net/articles/images/2008/07/newEntityClassDatabaseWiz4Final.png
Nhấn Finish để kết thúc wizard. Bạn có thể thấy lớp UserGenEntity trong cửa sổ Project đồng thời bạn sẽ thấy các thư viện TopLink được thêm vào trong mục Libraries như hình sau:
http://www.javabeat.net/articles/images/2008/07/LibrariesAdded.png

Bạn cũng nên thêm phương thức constructor copy cho lớp UserGenEntity như sau

public UserGenEntity(int id,String fn,String ln) {
this.id=id;
this.firstname=fn;
this.lastname=ln;
}

5. Code cho ứng dụng JPA

Thêm vào ứng dụng chúng ta lớp UserManager.java với nội dung code được cho sau đây:

package com.myJpa;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Query;

public class UserManager {

    private EntityManager em;

    public UserManager(EntityManagerFactory emf) {
        em = emf.createEntityManager();
    }

    public void createUser(UserGenEntity user) {
        em.getTransaction().begin();
        em.persist(user);
        em.getTransaction().commit();
    }

    public UserGenEntity searchById(Integer id) {
        return em.find(UserGenEntity.class, id);
    }

    public void updateUser(UserGenEntity user) {
        em.getTransaction().begin();
        em.merge(user);
        em.getTransaction().commit();
    }

    public void removeUser(UserGenEntity user) {
        em.getTransaction().begin();
        em.remove(user);
        em.getTransaction().commit();
    }

    public List getAll() {
        Query query = em.createQuery("select a from UserGenEntity a");
        List list = query.getResultList();
        return list;
    }

    public void close() {
        em.close();
    }
}

Codetrên gồm các phương thức sau

  • createUser — Tạo 1 user database.
  • searchById — Tìm kiếm 1 User theo ID.
  • updateUser — update thông tin của user từ bảng
  • removeUser — xóa user khỏi danh sách.
  • getAll — lấy tất cả users từ bảng

6. Chạy thử ứng dụng JPA

Bây giờ chúng ta có thể viết ứng dụng được rồi. Nhưng đừng quên thêm MySQL Driver vào project của bạn bằng cách nhấn phải chuột lên mục libraries trong của sổ project, chọn Add library. Cửa sổ sau xuất hiện và bạn phải chọn driver cho MySQl
http://www.javabeat.net/articles/images/2008/07/addMySQLDriver.png
Nhấn OK.
Bây giờ ta tạo 1 lớp mới với 1 hàm main để test ứng dụng. Code như sau

package com.myJpa;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class TestJPA {

    private UserManager um;
    private EntityManager em;
    private EntityManagerFactory emf;
    private static final UserGenEntity user1 = new UserGenEntity(1, "Nguyen Van", "Tèo");
    private static final UserGenEntity user2 = new UserGenEntity(2, "Thân Thị", "Đẹt");

    protected void setUp() throws Exception {
        emf = Persistence.createEntityManagerFactory("MyJPAApplicationPU");
        em = emf.createEntityManager();
        um = new UserManager(emf);
    }

    protected void close() throws Exception {
        um.close();
        em.close();
        emf.close();
    }

    public void test() {
        um.createUser(user1);
        UserGenEntity user = um.searchById(1);
        System.out.println("After creation of user in table");
        System.out.println("Firstname: " + user.getFirstname());
        System.out.println("Lastname: " + user.getLastname());

        user.setFirstname("Trần Anh");
        um.updateUser(user);

        user = um.searchById(1);
        System.out.println("After update.");
        System.out.println("Firstname: " + user.getFirstname());
        System.out.println("Lastname: " + user.getLastname());

        System.out.println("Adding one more record");
        um.createUser(user2);

        List list = um.getAll();
        System.out.println("Number of users: " + list.size());
    }

    public static void main(String args[]) {
        System.out.println("Inside TestJPA main");
        TestJPA testJPA = new TestJPA();
        try {
            testJPA.setUp();
            testJPA.test();
            testJPA.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("End of TestJPA main");
    }
}  

Kết quả sau khi thực thi ứng dụng:

init:
deps-jar:
compile:
run:
Inside TestJPA main
[TopLink Info]: 2008.10.24 10:08:52.938–ServerSession(32019423)–TopLink, version: Oracle TopLink Essentials – 2.0.1 (Build b09d-fcs (12/06/2007))
[TopLink Info]: 2008.10.24 10:08:53.503–ServerSession(32019423)–file:/C:/Users/Hamy/Documents/NetBeansProjects/MyJPAApplication/build/classes/-MyJPAApplicationPU login successful
[TopLink Warning]: 2008.10.24 10:08:53.560–ServerSession(32019423)–Exception [TOPLINK-4002] (Oracle TopLink Essentials – 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table ‘user’ already exists
Error Code: 1050
Call: CREATE TABLE user (ID INTEGER NOT NULL, FIRSTNAME VARCHAR(255), LASTNAME VARCHAR(255), PRIMARY KEY (ID))
Query: DataModifyQuery()
After creation of user in table
Firstname: Tr?n Văn
Lastname: Tèo
After update.
Firstname: Tr?n Anh
Lastname: Tèo
Adding one more record
Number of users: 2
[TopLink Info]: 2008.10.24 10:08:53.660–ServerSession(32019423)–file:/C:/Users/Hamy/Documents/NetBeansProjects/MyJPAApplication/build/classes/-MyJPAApplicationPU logout successful
End of TestJPA main
BUILD SUCCESSFUL (total time: 2 seconds)

Kiểm tra kết quả bằng cách nhấn Ctrl-5 để mở cửa sổ Service, Nhấn chuột phải lên Bảng User của chúng ta rồi chọn View Data, kết quả sẽ có 2 mẫu tin mới vừa thêm vào.
Chúc thành công!

8 Responses to “Làm việc với JPA trong NetBean 6.1”

  1. Hibernate show JTable said

    Thầy có thể chỉ em cách show dữ liệu trên 1 JTable trong java desktop không. Em làm hoai mà không được, em có thể show các record trong console mà không thể show trên JTable

  2. vovanhai said

    Xem bài: https://vovanhai.wordpress.com/java/l%E1%BA%ADp-trinh-java-nang-cao/jdbc-java-database-connectivity/bi%E1%BB%83u-di%E1%BB%85n-quan-h%E1%BB%87-m%E1%BB%91i-quan-h%E1%BB%87-master-details-b%E1%BA%B1ng-jtree-jtable/

  3. Nhân Lê said

    Em đã tốt nghiệp rồi nhưng thỉnh thoảng vẫn gặp một số vấn đề về lập trình… Những hướng dẫn của thầy tuy cơ bản nhưng nó đã giúp em giải quyết tốt công việc.
    Cám ơn thầy rất nhiều!

  4. Nhân Lê said

    Thầy ơi em gặp một trục trặc nhỏ lúc save unicode xuống: một số ký tự unicode lưu xuống cơ sở dữ liệu sai mã. Ví dụ: ký tự “đ” sẽ bị lưu xuống thành ?, các ký tự khác như “ọ”, “ệ”, “ở”… cũng bị tình trạng như vậy. Em đoán là trên ứng dụng lưu xuống DB dạng ANSI chứ không phải Unicode nhưng em không biết phải cấu hình ở đâu. Em đã thử với phần services của netbeans, ở đó nó lưu xuống ký tự đầy đủ, không gặp tình trạng như trên! Như vậy em nghĩ cũng không phải do cái driver.
    Hướng giải quyết tạm thời của em là lưu xuống và chuyện sang dạng ISO-8859-1 nhưng nếu vậy sẽ gây khó khăn trong tìm kiếm và về quản lý dữ liệu.
    Em đang sử dụng JDK 1.6. , MySql 5. và phiên bản IDE Netbeans là 6.1 hoặc 6.7.1.
    Mong thầy hướng dẫn em cách khắc phục!

  5. Nhân Lê said

    Em đã tìm được cách giải quyết rồi! Tham khảo link bên dưới, xem bảng tham số:
    http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html
    Có 2 tham số cần chú ý là useUnicode và characterEncoding.

  6. man said

    thế là sao bạn Nhân Lê nói rõ hơn cho mình chút được không :”>

  7. Nhân said

    À, lâu lắm rồi Nhân không có nhớ rõ nữa nhưng đại loại nó là một cái tham số báo cho driver biết là phải dùng Unicode khi lưu xuống (Forces the driver to use Unicode character encodings) và chỉ làm việc với unicode.
    Bạn vào link trên comment của mình, tìm đến cái bảng mô tả thuộc tính tên Miscellaneous là thấy ngay, 2 properties đầu ấy. Đó cũng là tài liệu của MySql Connector luôn đó, có thắc mắc gì thêm thì vào đó tìm có đủ hết!
    Chúc bạn thành công, và rất cảm ơn thầy Hải!

  8. hùng said

    cái phần database em show ra ko được , xin thầy giúp đỡ

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.

Join 2,195 other followers

%d bloggers like this: