Võ Văn Hải's blog

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

Thiết lập Eclipse JPA Project dựa trên Java SE sử dụng Hibernate

Các phần mềm phải có

  • Eclipse Ganymede 3.4
  • Một hệ quản trị CSDL. Ở đây tôi sử dụng MySQL 5.0.
  • Một JDBC Driver cho database. Tôi sử dụng Connector/J 5.0 driver của MySQL
  • Hibernate
    • Hibernate Core 3.2.5.GA
    • Hibernate EntityManager 3.3.1.GA

Để tạo ứng dụng JPA với eclipse, ta cần thiết lập cho cả 2 vấn đề sau:

  • Cấu hình JPA Implementation Library
  • Cấu hình 1 kết nối đếndatabase

1. Cấu hình JPA Implementation Library

Bởi vì Hibernate không được cấu hình sẵn trong eclipse nên chúng ta phải tạo 1 Eclipse User Library. Các thư viện của Hibernate chúng ta có thể download tại http://www.hibernate.org/6.html. Chúng ta cần 2 thư viện Hibernate Core và Hibernate EntityManage. Sau khi download về, ta giải nén vào 1 thư mục nào đó, chẳng hạn như C:\javaSoft.

Trong môi trường Eclipse Ganymede, chọn menu Windows->References, rồi tiếp tục chọn Java -> Build Path -> User Libraries. Nhấn nút New để thêm mới 1 thư viện, đặt tên là Hibernate.

Nhấn nút Add JARs… để thêm vào các thư viện sau:

  • hibernate-entitymanager.jar
  • lib/hibernate-annotations.jar
  • lib/ejb3-persistence.jar
  • lib/hibernate-commons-annotations.jar
  • hibernate3.jar
  • antlr-2.7.6.jar
  • hibernate-core.jar
  • commons-collections-3.1.jar
  • dom4j-1.6.1.jar
  • javassist-3.4GA.jar
  • jta-1.1.jar
  • slf4j-log4j12.jar
  • log4j.jar

Kết quả như hình sau:

https://vovanhai.files.wordpress.com/2008/10/jpa_config1.png
Nhấn OK để hoàn tất công việc.

2. Tạo Database

Tạo data base tên subscription bằng cách chạy lệnh sau trong MySQL Comand Promt

CREATE DATABASE subscription;

hoặc dùng “MySQL Query Browser” để tạo database. Chạy script sau để sinh ra table

DROP TABLE IF EXISTS `subscription`.`account`;
CREATE TABLE `subscription`.`account` (
`id` int(10) unsigned NOT NULL auto_increment,
`email` varchar(128) NOT NULL,
`firstname` varchar(128) NOT NULL,
`lastname` varchar(128) NOT NULL,
`company` varchar(128) NOT NULL,
`phone` varchar(128) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

3. Tạo Eclipse project

Trong Eclipse, tạo 1 JPA project bằng cách vào menu File->New->Project, sau đó tìm đến JPA project như hình
https://vovanhai.files.wordpress.com/2008/10/jpa_eclipse_02.png

Nhấn Next, thiết lập các tùy chọn như hình sau:
https://vovanhai.files.wordpress.com/2008/10/jpa_eclipse_03.png
Nhấnnút Next, ta được
https://vovanhai.files.wordpress.com/2008/10/jpa_eclipse_04.png

Nhấn link “Add conection” để tạo 1 connection mới. Chọn My Sql như hình
https://vovanhai.files.wordpress.com/2008/10/jpa_eclipse_05.png
Nhấn Next
https://vovanhai.files.wordpress.com/2008/10/jpa_eclipse_06.png
Có thể nhấn nút “Test Connection” để đảm bảo kết nối thành công. Nhấn Finish để kết thúc việc tạo connection. để quay lại của sổ tạo JPA Project. Nhấn Finish để tạo project mới.

Mở rộng các node của project trong cửa sổ project explorer ta có kết quả như hình.
https://vovanhai.files.wordpress.com/2008/10/jpa_eclipse_07.png

Hiệu chỉnh file persistence.xml với nội dung sau:

<?xml version=”1.0″ encoding=”UTF-8″?>
<persistence version=”1.0″ xmlns=”http://java.sun.com/xml/ns/persistence&#8221; xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance&#8221; xsi:schemaLocation=”http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd”&gt;
<persistence-unit name=”AccountSubscription”>
<mapping-file>META-INF/orm.xml</mapping-file>
<class>com.vovanhai.wordpress.account.Account</class>
<properties>
<property name=”hibernate.dialect” value=”org.hibernate.dialect.MySQLDialect” />
<property name=”hibernate.connection.driver_class” value=”com.mysql.jdbc.Driver” />
<property name=”hibernate.connection.url” value=”jdbc:mysql://localhost:3306/subscription” />
<property name=”hibernate.connection.username” value=”root” />
<property name=”hibernate.connection.password” value=”” />
</properties>
</persistence-unit>
</persistence>

Có thể eclipse sẽ thông báo lỗi cho file xml này, mặc kệ nó, bạn tiếp tục làm theo các bước sau

Tạo package com.vovanhai.wordpress.account

Tạo lớp Account.java trong package này với nội dung sau

package com.vovanhai.wordpress.account;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = “account”, schema = “subscription”)
public class Account implements Serializable {
/*private static final Logger logger = Logger.getLogger(
“com.vovanhai.wordpress.account.Account”);*/
private static final long serialVersionUID = -7201186159122319296L;

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String email;
private String firstname;
private String lastname;
private String company;
private String phone;

public Account() {
this(“”,””,””,””,””);
}
public Account(String email, String firstname,String lastname,
String company,String phone) {
this.email=email;
this.firstname=firstname;
this.lastname=lastname;
this.company=company;
this.phone=phone;
//logger.info(“Load records”);//in vết
}
@Column(name=”email”)
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Column(name=”firstname”)
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
@Column(name=”lastname”)
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
@Column(name=”company”)
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
@Column(name=”phone”)
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Column(name=”id”)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return id+”; “+ firstname+”; “+lastname+”;”+  email
+company+”;”+phone;
}
}

Vậy là chúng ta đã tạo 1 đối tượng POJO ánh xạ giữa đối tượng Account với bảng account của database.

Tiếp theo, bạn thêm 1 tham chiếu đến MySQL driver vào trong project bằng cách nhấn phải chuột lên project, chọn properties, chọn đến mục “Java Build Path”, nhấn nút “Add External JARs…” rồi chọn MySQL connector – file mysql-connector-java-5.1.6-bin.jar.

tạo lớp main có tên AccountRepository.java để thử ứng dụng

package com.vovanhai.wordpress.account;

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

public class AccountRepository {
public static void main(String args[]) {
EntityManagerFactory emf = null;
EntityManager em = null;
EntityTransaction et=null;
try {
// SetUp
emf = Persistence.createEntityManagerFactory(“AccountSubscription”);
em = emf.createEntityManager();
et = em.getTransaction();
et.begin();//begin transaction

//=============================================
//tạo đối tượng account
Account acc = new Account();
acc.setEmail(“tyteo@gmail.com”);
acc.setCompany(“HUI Uni”);
acc.setPhone(“07769 697996”);
acc.setFirstname(“Nguyễn văn”);
acc.setLastname(“Tèo”);
// tạo mẫu tin Account trong database
em.persist(acc);

//=============================================

//tìm mẫu tin theo khóa chính
int id=1;
acc=FindingByID(em,id);
if(acc!=null)
System.out.println(acc);
else
System.out.println(“Không có account “+id);
//=============================================
List<Account> lst=GetAll(em);
if(lst!=null)
for(Account a:lst)
System.out.println(a);
//=============================================
System.out.println(“Danh sách Account có tên Tý”);
List<Account>lstName=GetByLastName(em, “Tý”);
if(lstName!=null)
for(Account a:lstName)
System.out.println(a);
//=============================================
// Commit and Clean-Up
et.commit();
em.close();
emf.close();
} catch (Exception ex) {
et.rollback();//khôi phục nếu bị lỗi
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
/**
* Tìm kiếm theo ID
* @param em
* @param id
* @return
*/
static Account FindingByID(EntityManager em,int id){
Account acc=null;
try {
acc= em.find(Account.class, new Integer(id));
} catch (Exception e) {
e.printStackTrace();
}
return acc;
}
/**
* Lấy danh sách tất cả Account từ bảng account
* @param em
* @return
*/
@SuppressWarnings(“all”)
static List<Account> GetAll(EntityManager em){
Query query=em.createQuery(“from Account”);
List<Account> lst= (List<Account>)(query.getResultList());
return lst;
}
/**
* Lọc danh sách tài khoản theo LastName
* @param em
* @param lastname
* @return
*/
@SuppressWarnings(“all”)
static List<Account> GetByLastName(EntityManager em,String lastname){
Query query=em.createQuery(“from Account as acc where acc.lastname=?1”);
query.setParameter(1, lastname);
//Có thể thay index bằng name
//Query query=em.createQuery(“from Account as acc where acc.lastname=:ln”);
//query.setParameter(“ln”, lastname);

List<Account> lst= (List<Account>)(query.getResultList());
return lst;
}
}

OK. Mọi thứ đã xong, bạn có thể chạy thử ứng dụng và thử mở database lên để kiểm tra.
Chúc thành công!

16 Responses to “Thiết lập Eclipse JPA Project dựa trên Java SE sử dụng Hibernate”

  1. Kevin said

    Cái orm.xml có cần config gì không anh?

  2. vovanhai said

    Như ví dụ là OK rồi!

  3. Hai said

    Thầy ơi .Bên em bị lỗi này :
    Exception in thread “main” java.lang.NoClassDefFoundError: javax/persistence/spi/PersistenceProvider
    at java.lang.ClassLoader.findBootstrapClass(Native Method)
    at java.lang.ClassLoader.findBootstrapClass0(ClassLoader.java:912)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:320)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:318)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:270)
    at javax.persistence.Persistence.findAllProviders(Persistence.java:79)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:49)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
    at test.Test.(Test.java:33)
    at test.Test.main(Test.java:52)
    Đây là lỗi gì thầy ?

  4. vovanhai said

    Em xem lại các libraries của em có đúng, đủ chưa.

  5. Hai said

    Vẫn còn bị lỗi thầy ơi.dúng từ library + cầu trúc thư mục nhưng vẫn bị lỗi

  6. MuaHong said

    Thầy ơi cho em hỏi: cài hibernate là chỉ cần add các thư viện như bước 1 hả thầy? Em cảm ơn thầy.

  7. tspt2910 said

    Em thấy trong Hibernate phải có một file Mapping file dạng xml, trong bài viết này em chưa thấy anh nói đến, có cách nào để gene tự động file này không ạ,
    nếu có anh có thể hướng dẫn thêm được không ạ.

  8. Võ Văn Hải said

    Khi dùng annotation thì không cần file đó nữa bạn.

  9. Nhat said

    Thầy ơi elipse của em không co JPA project thi phải làm sao ?

  10. Võ Văn Hải said

    “Thầy ơi elipse của em không co JPA project thi phải làm sao ?”
    Chọn bản JavaEE nó mới có.

  11. Nhat said

    Ra là vậy, thanks thầy

  12. QuocThao said

    [PersistenceUnit: HibernateJPA] Unable to configure EntityManagerFactory

    Lỗi vậy là sao Thầy

    file persistence.xml

    org.hibernate.ejb.HibernatePersistence

    META-INF/orm.xml
    hbn.entity.ChiTietDonDatHang
    hbn.entity.HangHoa
    hbn.entity.KhachHang
    CALLBACK

    Class java cua e:

    org.hibernate.ejb.HibernatePersistence

    META-INF/orm.xml
    hbn.entity.ChiTietDonDatHang
    hbn.entity.HangHoa
    hbn.entity.KhachHang
    CALLBACK

  13. Võ Văn Hải said

    Lỗi file persistence.xml đó em. Coi lại file đó có well-form và có validate không nhé!

  14. QuangH said

    , em chỉ biết JPA chỉ biết nó là frame work ORM còn Hibernate cũng vậy , 2 cái nó gần giống nhau , nhưng các công ty hay làm về hibernate, em chưa biết hibernate.
    Em có câu hỏi nhưng không biết gửi vào mục nào mong thầy giúp em ah
    “Sự khác biệt giữa JPA và Hibernate là gì?”

  15. Thầy ơi! cho em hỏi là muốn viết một web app theo hướng dịch vụ SaaS mà dùng Hibernate nếu tạo một project thì tạo bằng JPA project được không thầy?

  16. David said

    @QuangH: JPA là chuẩn mô tả các đặc tả về ORM, hibernate là 1 ORM framework. JPA chỉ cung cấp interface, còn hibernate sẽ implement các interface đó.

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

 
%d bloggers like this: