[Hibernate] Khắc phục lỗi An AnnotationConfiguration instance is required to use

  • 173
  • 0
Khi sủ dụng Hibernate annotation thì nó yêu cầu sử dụng “AnnotationConfiguration” thay vì “Configuration()” để khởi tạo session factory.

Code:
INFO: Configuration resource: /hibernate.cfg.xml
Initial SessionFactory creation failed.org.hibernate.MappingException:
An AnnotationConfiguration instance is required to use <mapping class="com.mkyong.common.Stock"/>
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.mkyong.persistence.HibernateUtil.buildSessionFactory(HibernateUtil.java:19)
    at com.mkyong.persistence.HibernateUtil.<clinit>(HibernateUtil.java:8)
    at com.mkyong.common.App.main(App.java:11)
Caused by: org.hibernate.MappingException: An AnnotationConfiguration instance is required to use <mapping class="com.mkyong.common.Stock"/>
    at org.hibernate.cfg.Configuration.parseMappingElement(Configuration.java:1600)
    at org.hibernate.cfg.Configuration.parseSessionFactory(Configuration.java:1555)
    at...

[Hibernate] Khắc phục lỗi org.hibernate.AnnotationException: Unknown Id.generator

  • 147
  • 0
Vấn đề
Chạy chương trình Hibernate có sử dụng annotation sequence generator với PostgreSQL database.

Java:
@Id
@Column(name="user_id", nullable=false)
@GeneratedValue(strategy = GenerationType.SEQUENCE ,generator="account_user_id_seq")
private Integer userId;
Sẽ xảy ra exception Unknown Id.generator.
Code:
Caused by: org.hibernate.AnnotationException: Unknown Id.generator: account_user_id_seq
    at org.hibernate.cfg.BinderHelper.makeIdGenerator(BinderHelper.java:413)
    at org.hibernate.cfg.AnnotationBinder.bindId(AnnotationBinder.java:1795)
    at org.hibernate.cfg.AnnotationBinder.processElementAnnotations(AnnotationBinder.java:1229)
    at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:733)
Sequence “account_user_id_seq” đã được tạo trong PostgreSQL database, tại sao xuất hiện exception như trên?

Giải pháp
Khi khai báo annotation của hibernate để sử dụng “Sequences” cho việc...

[Hibernate] Khắc phục lỗi Remember that ordinal parameters are 1-based! – HibernateTemplate

  • 76
  • 0
Vấn đề
Code sử dụng HibernateTemplate …
Java:
getHibernateTemplate().find("from Domain d
where d.domainName = :domainName", domainName);
Khi chạy đoạn code trên, sẽ xuất hiện lỗi sau
Code:
java.lang.IndexOutOfBoundsException: Remember that ordinal parameters are 1-based!
    ...
    at org.hibernate.impl.AbstractQueryImpl.determineType(AbstractQueryImpl.java:397)
    at org.hibernate.impl.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:369)
Giải pháp
Đi sâu vào bên trong và đọc code trong file HibernateTemplate.java sẽ thấy đoạn code sau
Java:
public List find(final String queryString, final Object[] values) throws DataAccessException {
    return (List) executeWithNativeSession(new HibernateCallback() {
        public Object doInHibernate(Session session) throws HibernateException {
            Query queryObject = session.createQuery(queryString);
            prepareQuery(queryObject)...

[Hibernate] Khắc phục lỗi java.lang.ClassNotFoundException : javassist.util.proxy.MethodFilter

  • 90
  • 0
Vấn đề
Sử dụng Hibernate 3.6.3, nhưng gặp lỗi javassist not found error, xem error stacktrace bên dưới:

Code:
Caused by: java.lang.NoClassDefFoundError: javassist/util/proxy/MethodFilter
    ...
    at org.hibernate.tuple.entity.PojoEntityTuplizer.<init>(PojoEntityTuplizer.java:77)
    ... 16 more
Caused by: java.lang.ClassNotFoundException: javassist.util.proxy.MethodFilter
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
    ... 21 more
Giải pháp
Không tìm thấy file javassist.jar, có thể download tại...

[Hibernate] Khắc phục lỗi The type AnnotationConfiguration is deprecated

  • 92
  • 0
Vấn đề
Sử dụng Hibernate 3.6, ta thấy “org.hibernate.cfg.AnnotationConfiguration“, bị đánh dấu là “deprecated“.

Code …
Java:
import org.hibernate.cfg.AnnotationConfiguration;
//...
private static SessionFactory buildSessionFactory() {
    try {

        return new AnnotationConfiguration().configure().buildSessionFactory();

    } catch (Throwable ex) {

        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}
Code vẫn chạy, chỉ hiển thị message cảnh báo deprecated, có cái gì có thể thay thế "AnationationConfiguration" không?

Giải pháp

Trong Hibernate 3.6, “org.hibernate.cfg.AnnotationConfiguration” bị deprecated và tất cả các chức năng được đưa qua “org.hibernate.cfg.Configuration“.

Vì vậy, hãy thay thế...

[Hibernate] Khắc phục lỗi Could not find C3P0ConnectionProvider

  • 83
  • 0
Vấn đề
Đã cấu hình Hibernate để sử dụng “c3p0” connection pool, nhưng xuất hiện cảnh báo sau:

Code:
//...
2011-04-25_12:18:37.190 WARN  o.h.c.ConnectionProviderFactory -
c3p0 properties is specificed, but could not find

org.hibernate.connection.C3P0ConnectionProvider from the classpath,
these properties are going to be ignored.
2011-04-25_12:18:37.191 INFO  o.h.c.DriverManagerConnectionProvider -
Using Hibernate built-in connection pool (not for production use!)
//...
Có vẻ như không tìm thấy class “org.hibernate.connection.C3P0ConnectionProvider”?

Giải pháp
Kể từ Hibernate v3.3 (nếu không nhầm), class “C3P0ConnectionProvider” đã được chuyển sang file jar khác là “hibernate-c3p0.jar“. Cần include nó vào, để Hibernate có thể support cho việc sử dụng c3p0 connection pool.

Có thể download “hibernate-c3p0.jar” từ JBoss public...

[Hibernate] Khắc phục lỗi Unable to insert if column named is keyword, such as DESC

  • 104
  • 0
Vấn đề
Bảng có tên “category” trong database MySQL, chứa cột có tên “DESC”.

SQL:
CREATE TABLE `category` (
  `CATEGORY_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `NAME` varchar(10) NOT NULL,
  `DESC` varchar(255) NOT NULL,
  PRIMARY KEY (`CATEGORY_ID`) USING BTREE
);
File mapping XML của Hibernate
XML:
<hibernate-mapping>
    <class name="com.mkyong.stock.Category" table="category" catalog="mkyongdb">
        ...
        <property name="desc" type="string">
            <column name="DESC" not-null="true" />
        </property>
       ...
    </class>
</hibernate-mapping>
Hoặc Hibernate annotation
Java:
@Column(name = "DESC", nullable = false)
    public String getDesc() {
        return this.desc;
    }
Khi insert dữ liệu vào bảng category, sẽ xuất hiện lỗi sau:
Code:
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:
   You have an error in your SQL syntax; check the manual...

[Hibernate] Lưu hình ảnh vào database

  • 102
  • 0
Để lưu hình ảnh vào database, cần xác định cột của bảng là kiểu blob trong MySQL hoặc loại nhị phân tương đương trong database khác. Trong Hibernate, có thể khai báo một biến kiểu byte[] để lưu trữ dữ liệu hình ảnh.

Download source code – Hibernate-Image-Example.zip

Đây là 1 prrooject Maven sử dụng Hibernate để lưu hình ảnh vào bảng ‘avatar' của MySQL.

1. Tạo bảng
Táo bảng có tên avatar trong MySQL

SQL:
CREATE TABLE  `mkyong`.`avatar` (
  `AVATAR_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `IMAGE` blob NOT NULL,
  PRIMARY KEY (`AVATAR_ID`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
2. Maven dependency

Thêm dependency Hibernate và MySQL.

pom.xml
XML:
<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"...

[Hibernate] Sử dụng các keyword của database trong hibernate

  • 82
  • 0
Trong Hibernate, khi cố lưu đối tượng vào bảng với bất kỳ keyword dành riêng cho database nào dưới dạng tên cột, có thể gặp phải lỗi sau …

Code:
ERROR JDBCExceptionReporter:78 - You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the
right syntax to use near 'Datadabase reserved keyword....
Keyword “DESC”
Trong MySQL, “DESC” là 1 keyword của database. Hãy xem một số ví dụ để nói về cách sử dụng keyword này trong Hibernate.

File mapping XML của Hibernate
Đây là file mapping XML mặc định cho 1 cột trong bảng, nó sẽ gây ra lỗi JDBCException…

XML:
<property name="desc" type="string" >
    <column name="DESC" length="255" not-null="true" />
</property>
Giải pháp
1. Bao keyword trong dấu [].

XML:
<property name="desc" type="string" >
    <column name="[DESC]" length="255" not-null="true" />
</property>
2. Sử dụng dấu nhấy đơn (‘) kèm...

[Hibenate] Gọi store procedure trong hibernate

  • 92
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ tìm hiểu về cách gọi store procedure trong hibernate

MySQL store procedure
Đây là 1 store procedure trong MySQL, nó nhận vào 1 tham số là stock code và trả về dữ liệu liên quan đến stock.

SQL:
DELIMITER $$

CREATE PROCEDURE `GetStocks`(int_stockcode varchar(20))
BEGIN
   SELECT * FROM stock where stock_code = int_stockcode;
   END $$

DELIMITER ;
Trong MySQL, có thể gọi bằng keyword call:

SQL:
CALL GetStocks('7277');
Sử dụng Hibernate để gọi store procedure
Trong Hibernate, có 3 cách để gọi store procedure trong database.

1. Native SQL – createSQLQuery
Sử dụng createSQLQuery() để gọi store procedure trực tiếp.

Java:
Query query = session.createSQLQuery(
    "CALL GetStocks(:stockCode)")
    .addEntity(Stock.class)
    .setParameter("stockCode", "7277");

List result = query.list();
for(int i=0; i<result.size(); i++){...

[Hibernate] Cấu hình hiển thị hibernate sql parameter - Log4j

  • 123
  • 0
Vấn đề
Hibernate có tính năng ghi log cơ bản để hiển thị câu SQL được tạo ra với property show_sql trong file cấu hình

Code:
Hibernate: INSERT INTO mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
VALUES (?, ?, ?, ?, ?, ?)
Tuy nhiên, nó không đủ để fix bug, giá trị của các Hibernate SQL parameter bị thiếu.

Giải pháp – Log4j

Yêu cầu sử dụng Log4J để hiển thị giá trị của Hibernate SQL parameter.

1. Cấu hình Log4j trong Hibernate
Theo dõi bài biết Cấu hình Log4j trong Hibernate

2. Thay đổi Log level
Chỉnh sửa file Log4j properties và...

[Hibernate] Cấu hình hiển thị hibernate sql parameter - P6Spy

  • 97
  • 0
Câu hỏi đặt ra
Có nhiều developer đặt ra câu hỏi về giá trị Hibernate SQL parameter. Làm thế nào để hiển thị giá trị của Hibernate SQL parameter được truyền vào database? Hibernate chỉ hiển thị giá trị tham số dưới dạng dấu hỏi (?). Với property show_sql, Hibernate sẽ hiển thị tất cả các câu SQL được tạo ra, nhưng không hiển thị các giá trị SQL parameter.

Lấy ví dụ
Code:
Hibernate: insert into mkyong.stock_transaction (CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
values (?, ?, ?, ?, ?, ?)
Vậy có cách nào để log hoặc hiển thị giá trị SQL paramerter của Hibernate không?

Giải pháp – P6Spy
Vâng, nếu có câu hỏi, có 1 câu trả lời ~

P6Spy là thư viện để ghi log các câu SQL và parameter trước khi truyền vào database. P6Spy là miễn phí, nó sử dụng để...

[Hibernate] Hiển thị SQL của hibernate ra console – show_sql , format_sql và use_sql_comments

  • 111
  • 0
Hibernate có 1 hàm để enable tính năng ghi log tất cả các lệnh SQL được tạo ra tại console. Có thể kích hoạt nó bằng cách tạo 1 property “show_sql” trong file cấu hình Hibernate “hibernate.cfg.xml“. Hàm này tốt cho xử lý sự cố cơ bản và để xem những gì mà Hibernate đang làm phía sau

1. show_sql
Enable ghi log tất cả lệnh SQL ra màn hình console

XML:
<!--hibernate.cfg.xml -->
<property name="show_sql">true</property>
Kết quả
Code:
Hibernate: insert into mkyong.stock_transaction
(CHANGE, CLOSE, DATE, OPEN, STOCK_ID, VOLUME)
values (?, ?, ?, ?, ?, ?)


2. format_sql
Format SQL được hibernate generate ra để dễ đọc hơn, sẽ chiếm nhiều không gian màn hình hơn.

XML:
<!--hibernate.cfg.xml -->
<property name="format_sql">true</property>
Kết quả
Code:
Hibernate:
    insert
    into
        mkyong.stock_transaction...

[Hibernate] Liệt kê các Hibernate SQL Dialect

  • 88
  • 0
Hibernate SQL Dialect sẽ nói cho ứng dụng Hibernate biết nên sử dụng ngôn ngữ SQL nào để giao tiếp với database.

1. DB2
Code:
org.hibernate.dialect.DB2Dialect
2. DB2 AS/400
Code:
org.hibernate.dialect.DB2400Dialect
3. DB2 OS390
Code:
org.hibernate.dialect.DB2390Dialect
4. PostgreSQL
Code:
org.hibernate.dialect.PostgreSQLDialect
5. MySQL
Code:
org.hibernate.dialect.MySQLDialect
6. MySQL with InnoDB
Code:
org.hibernate.dialect.MySQLInnoDBDialect
7. MySQL with MyISAM
Code:
org.hibernate.dialect.MySQLMyISAMDialect
8. Oracle 8
Code:
org.hibernate.dialect.OracleDialect
9. Oracle 9i/10g
Code:
org.hibernate.dialect.Oracle9Dialect
10. Sybase
Code:
org.hibernate.dialect.SybaseDialect
...

[Hibernate] Cách thêm file hibernate XML mapping (hbm.xml) theo cách lập trình

  • 118
  • 0
File mapping XML của Hibernate chứa relationship mapping giữa class Java và table trong database. Chúng thường có tên là “xx.hbm.xml” và khai báo trong file cấu hình Hibernate “hibernate.cfg.xml”.

Ví dụ, file mapping (hbm.xml) được khai báo trong thẻ “mapping”.

XML:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
  <property name="hibernate.bytecode.use_reflection_optimizer">false</property>
  <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  <property name="hibernate.connection.password">password</property>
  <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mkyong</property>
  <property name="hibernate.connection.username">root</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>...

[Hibernate] Cách load file hibernate.cfg.xml từ một thư mục khác

  • 114
  • 0
File cấu hình XML của Hibernate “hibernate.cfg.xml” thường được đặt ở thư mục gốc của project classpath, bên ngoài của bất kì package nào. Nếu cho file cấu hình vào thư mục khác, sẽ gặp lỗi bên dưới:

Code:
Initial SessionFactory creation failed.org.hibernate.HibernateException:
/hibernate.cfg.xml not found

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.mkyong.persistence.HibernateUtil.buildSessionFactory(HibernateUtil.java:25)
    at com.mkyong.persistence.HibernateUtil.<clinit>(HibernateUtil.java:8)
    at com.mkyong.common.App.main(App.java:11)
Caused by: org.hibernate.HibernateException: /hibernate.cfg.xml not found
    at org.hibernate.util.ConfigHelper.getResourceAsStream(ConfigHelper.java:147)
    at org.hibernate.cfg.Configuration.getConfigurationInputStream(Configuration.java:1405)
    at org.hibernate.cfg.Configuration.configure(Configuration.java:1427)
    at...

[Hibernate] Maven + (Spring + Hibernate) Annotation + MySql

  • 134
  • 0
Download – Spring-Hibernate-Annotation-Example.zip

Trong bài trước, chúng ta đã sử dụng Maven để tạo Java project đơn giản và sử dụng Hibernate trong Spring framework để thực hiện các thao tác (select, insert, update và delete) tại database MySQL. Trong bài này, ta sẽ biết thêm cách làm điều tương tự bằng annotation Spring và Hibernate.

Yêu cầu tiên quyết
– Cài đặt và cấu hình Maven, MySQL, Eclipse IDE.

Thư viện javaee.jar cần thiết hơn, có thể lấy nó từ j2ee SDK và include thủ công, đây không là phiên bản đầy đủ của javaee.jar đang có trong bất kỳ Maven repoitory nào.

Cấu trúc project sau cùng
Cấu trúc project cuối cùng như sau, nếu mất trong việc tạo cấu trúc thư mực, hãy xem bên dưới...

Maven + Spring + Hibernate + MySql

  • 124
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ sử dụng Maven để tạo 1 Java project đơn giản và sử dụng Hibernate trong Spring framework để thực hiện các thao tác với dữ liệu (insert, select, update và delete) trong database MySQL.

Cấu trúc project sau cùng
Đây là cấu trúc project, nếu bạn gặp khó khăn trong việc tạo cấu trúc thư mục, hãy xem cấu trúc thư mục dưới đây.

mavan-spring-hibernate-mysql.gif


1. Tạo table
Tạo table ‘stock’ trong database MySQL:

SQL:
CREATE TABLE  `mkyong`.`stock` (
  `STOCK_ID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `STOCK_CODE` varchar(10) NOT NULL,
  `STOCK_NAME` varchar(20) NOT NULL,
  PRIMARY KEY (`STOCK_ID`) USING BTREE,
  UNIQUE KEY `UNI_STOCK_NAME` (`STOCK_NAME`),
  UNIQUE KEY `UNI_STOCK_ID` (`STOCK_CODE`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;
2. Cấu trúc file trong...

[Hibernate] Struts + Spring + Hibernate

  • 118
  • 0
Download source code Struts 1.x + Spring + Hibernate – Struts-Spring-Hibernate-Example.zip

Chào các bạn, trong bài viết này, chúng ta sẽ tạo ứng dụng web quản lí khách hàng đơn giản. Dùng Maven để quản lý project, Struts 1.x là web framework, Spring là dependency injection framework và Hibernate là database ORM framework.

Kiến trúc tích hợp tổng thể thì giống như bên dưới:

Code:
Struts (Web page) <---> Spring DI <--> Hibernate (DAO) <---> Database
Để tích hợp tất cả kỹ thuật với nhau, bạn phải:
  1. Tích hợp Spring với Hibernate với class “LocalSessionFactoryBean" của Spring.
  2. Tích hợp Spring với Struts bằng plug-in có sẵn trong Spring để support Struts là “ContextLoaderPlugIn“.

1. Cấu trúc Project
Đây là cấu trúc sau cùng của project này.
[ATTACH type="full"...​

[Hibernate] Tích hợp Hibernate vào Struts framework

  • 93
  • 0
Chào các bạn, trong bài viết này, chúng ta sẽ cùng tìm hiểu về cách tích hợp Hibernate vào web application được phát triển bằng Apache Struts 1.x.

Download source code – Struts-Hibernate-Example.zip

Các bước tích hợp:
  1. Tạo file Hibernate Struts plug-in để thiết lập Hibernate session factory trong servlet context, và include file này vào file struts-config.xml.
  2. Trong Struts, lấy Hibernate session factory trong servlet context và ra lệnh Hibernate làm bất cứ việc gì bạn muốn.

1. Hibernate Struts Plug-in
Tạo Hibernate Struts Plug-in, lấy Hibernate session factory, đưa nó vào servlet context cho người dùng sau - servlet.getServletContext().setAttribute(KEY_NAME, factory);.

Java:
package com.mkyong.common.plugin;

import java.net.URL;
import javax.servlet.ServletException...