Spring 4 +Hibernate(p1)

P1. Generate Schema with Hibernate.

Đối với các dự án, việc thiết kế và viết mã để build database mất khá nhiều thời gian. Và việc update cấu trúc khiến cho người lập trình gặp nhiều trouble.
Một tiện ích tuyệt với cho các lkv java , từ hibernate 3 trở đi, hibernate cung cấp cho phép dev tạo ra các entity cho databse và quản lý cấu trúc database của mình từ các entity đó, sử dụng các annotations đúng vị trí . Bạn hoàn toàn không phải thực hiện các thao tác tạo các scrip sql cũng như update database khi có sự thay đổi.
Điều duy nhất bạn cần làm đó quản lý lớp entity của mình . Hibernate sẽ thực hiện các công việc create , update database schema.
1.Update databse schema của bạn:
Việc cài đặt để hibernate create or update database của bạn hết sức dễ dàng, tất cả những điều bạn cần là cài đặt thuộc tính hibernate.hbm2đl.auto property :

<hibernate-configuration>
   <session-factory>
      <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
      <property name="hibernate.hbm2ddl.auto">create-drop</property>
      ...

   </session-factory>
</hibernate-configuration>

Việc cấu hình property "create-drop sẽ tạo ra 1 database mới mỗi lần bạn start ứng dụng của mình, thận trọng trong việc sử dụng mode này. Toàn bộ dữ liệu trong database của bạn sẽ bị xóa sạch khi bạn start ứng dụng với mode này.
Nếu bạn set giá trị cho thuộc tính này là update , hibernate sẽ tạo database mới nếu nó chưa tồn tại và nó sẽ update lên databse đó nếu có một vài thay đổi từ entity của bạn.
Mặc định hibernate sẽ generate các bảng và các fields giống giống với tên của entity và các field bạn đặt.

public class Client implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String firstName;

    private String lastName;
    ...
}

Đối với class này, hibernate sẽ sinh ra đoạn mã tương ứng trong database của bạn , dưới đây là đoạn mã hibernate generate:

create table Client (
        id bigint generated by default as identity (start with 1),
        firstName varchar(255),
        lastName varchar(255),
        ...
        primary key (id)
    );

Đến thời điểm này . mọi việc diễn ra rất tuyệt vời, việc quản lý code bạn đã nhẹ nhàng đi rất nhiều. Nhưng câu hỏi lúc này đặt ra với naming conventions - làm thế nào chúng ta có thể custom lại các tên table or tên cloumn , không sử dụng generate default của hibernate. Để thực hiện custom, đơn giản bạn chỉ cần sử dụng thuộc tính name cho các Entity và column bạn muốn quản lý naming convertion.

@Entity(name="T_CLIENT")
public class Client implements Serializable {
    ...
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="CLIENT_ID")
    private Long id;

    @Column(name="FIRST_NAME")
    private String firstName;

    @Column(name="LAST_NAME")
    private String lastName;
    ...
}

Cool. Chúng ta đã có thể giải quyết được vấn đề về naming convertion, cấu trúc schema nhìn đã "pro" hơn rồi. 😃. </br> Nhưng vấn đè xảy ra là bạn đối với dự án thật , việc set tên từng entity cũng như column lại là công việc khá là nhàm chán take khá nhiều time không cần thiết. Và có 1 cách tốt hơn việc custom này. Hibernate đã đưa cho chúng ta 1 vài cách sử lý naming convertion, bạn có thể lựa chọn và cấu hình cho database của mình. Và đối với các trường hợp đặc biệt hãy sử dụng đến thuộc tính name 😄.</br> org.hibernate.cfg.ImprovedNamingStrategy là mode tôi lựa chọn cho naming database của mình. Hibernate sẽ kiểm tra các entity của bạn và tự động conver tên (đặt theo cú pháp lạc đà) về dạng như sau: isActive -> is_active , billCode ->bill_code.
Để cấu hình naming auto cho hibernate bạn có thể sử dụng như sau

spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.ejb.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.physical_naming_strateg = org.hibernate.cfg.ImprovedNamingStrategy

Với việc cấu hình, đoạn sql hibernate sẽ tạo ra cho bạn như sau:

   create table client (
        id bigint generated by default as identity (start with 1),
        first_name varchar(255),
        last_name varchar(255),
        ...
        primary key (id)
    );

Trong phần tới của bài viết, tôi sẽ viết thêm về cách tạo các ràng buộc từ entity. Tận dụng "sức mạnh" của hibernate cho việc thao tác với databasecuar bạn
Tài liệu : http://javarticles.com/2015/06/generating-database-schema-using-hibernate.html
http://www.javaworld.com/article/2077886/data-storage/custom-schema-generation-with-hibernate-annotations.html?page=2