Trong bài viết này, mình sẽ đề cập một trong những annotation cơ bản để làm việc với mapping các cột của bảng trong database, đó là annotation @Id trong JPA.
Chúng ta đi thẳng vào vấn đề luôn nhé các bạn.
Annotation này được khai báo để xác định đâu là thuộc tính primary key của entity tương ứng với các cột primary key trong bảng. Ví dụ thường thường chúng ta lấy cột id làm primary key trong bảng thì khi mapping với Java entity object, chúng ta sẽ thêm @Id annotation đi kèm với thuộc tính tương ứng với cột id này.
Ví dụ như mình có entity sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
package com.huongdanjava.jpa; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import lombok.Getter; import lombok.Setter; @Entity @Table @Getter @Setter public class Clazz { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column private String name; } |
Một entity bắt buộc phải có ít nhất một thuộc tính primary key đi kèm với @Id annotation. Nếu các bạn không khai báo bất kỳ một @Id annotation nào, khi chạy các bạn sẽ gặp lỗi ngay.
Ví dụ, nếu giờ mình comment cái @Id annotation của thuộc tính id trong lớp Clazz, khi chạy mình bị lỗi sau:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Exception in thread "main" javax.persistence.PersistenceException: Unable to build entity manager factory at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:66) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39) at com.huongdanjava.jpa.Application.main(Application.java:14) Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.huongdanjava.jpa.Clazz at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:265) at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:211) at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:712) at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:245) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:222) at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:265) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:848) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:876) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:58) ... 3 more |
Chúng ta có thể sử dụng nhiều kiểu dữ liệu của Java cho thuộc tính là primary key của entity. Cụ thể như sau:
- Primitive: byte, int, short, long, char.
- Wrapper của primitive: Byte, Integer, Short, Long, Character.
- String, BigInteger.
- java.util.Date, java.sql.Date
Ngoài ra, chúng ta còn có thể sử dụng float và double cũng như các wrapper của những primitive này như Float, Double, BigDecimal nhưng những kiểu dữ liệu này chúng ta không nên dùng bởi vì đây là những giá trị thập phân, dễ xảy ra lỗi khi làm tròn.
ducquoc.wordpress.com
Còn có UUID nũa , cũng xài làm ID duoc. Tuy nhien impl v4 or v1 của nó cũng có thể xài Hibernate.