Trong bài viết Cơ bản về Hibernate và Cơ bản về JPA, mình đã gọi những class ánh xạ các bảng clazz và students trong database là những Java object. Nhưng thực chất, mình phải gọi chúng là những entity mới đúng bởi vì chúng đại diện cho các bảng trong database và mỗi object của chúng là một dòng trong những bảng đó.
Những class này sử dụng annotation @Entity và @Table. Để các bạn hiểu thêm, mình xin nói rõ hơn về 2 annotation đó trong bài viết này.
Annotation @Entity
Để nói về @Entity annotation, đầu tiên các bạn nên biết về POJO (Plain Old Java Object) và JavaBean.
POJO là những Java object mà chúng không bị hạn chế bởi bất cứ thứ gì khác. Chúng không hiện thực hay được mở rộng từ bất kỳ một class nào khác và chúng cũng không chứa bất kỳ annotation nào trong bản thân chúng. Chúng chỉ chứa các thuộc tính, các phương thức Setter, Getter của những thuộc tính đó và có thể có thêm cả các phương thức override toString() và equals().
Ví dụ:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
public class Clazz { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
Còn JavaBean thì sao, thật ra chúng là những POJO có ít nhất một constructor không có tham số và chúng chỉ có thể hiện thực thêm interface Serializable mà thôi.
OK, những gì mình vừa đề cập cũng đủ để nói về @Entity annotation rồi.
Thật ra, công dụng chính của @Entity annotation là biến một JavaBean trở thành một entity để chúng ta có thể thao tác với database sử dụng entity này. Đó là tất cả, nếu các bạn không sử dụng @Entity annotation thì khi chạy chương trình bạn sẽ gặp lỗi ngay.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Exception in thread "main" org.hibernate.MappingException: Unknown entity: com.huongdanjava.hibernateexample.Clazz at org.hibernate.internal.SessionFactoryImpl.getEntityPersister(SessionFactoryImpl.java:776) at org.hibernate.internal.SessionImpl.getEntityPersister(SessionImpl.java:1533) at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:104) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:192) at org.hibernate.event.internal.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:38) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:177) at org.hibernate.event.internal.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:32) at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:73) at org.hibernate.internal.SessionImpl.fireSave(SessionImpl.java:682) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:674) at org.hibernate.internal.SessionImpl.save(SessionImpl.java:669) at com.huongdanjava.hibernateexample.Application.main(Application.java:20) |
Nếu các bạn không sử dụng @Table annotation trong entity của mình, thì mặc định tên bảng trong database sẽ là tên lớp của entity.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@Entity public class Clazz { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
Trong trường hợp này, tên bảng trong database tương ứng sẽ là clazz.
Ngoài ra chúng ta còn có thể điều chỉnh lại tên bảng bằng cách khai báo thêm thuộc tính name trong @Entity annotation. Trong trường hợp này, tên của entity cũng sẽ thay đổi theo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@Entity(name = "Class") public class Clazz { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
Ở đây, tên bảng sẽ là class và tên của entity này cũng sẽ thay đổi là Class.
Annotation @Table
Trong trường hợp, các bạn chỉ muốn thay đổi tên bảng của database sẽ sử dụng trong ứng dụng của mình mà không thay đổi tên của entity, sử dụng @Table annotation sẽ đáp ứng nhu cầu đó của bạn.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
@Entity @Table(name = "class") public class Clazz { private Long id; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } |
Ở đây, tên bảng mà chúng ta sẽ sử dụng là class còn tên entity vẫn là Clazz.