一、怎样映射一个实体
一个实体就是简单 Java 类 -a Plain Old Java Object (POJO) ,并遵循下列规则:
-
实体类必须标注 @javax.persistence.Entity 注解 ( 或者用 XML 描述为一个实体 )
-
@javax.persistence.Id 注解必须使用,指出 a primary key
-
实体类必须有一个无参的构成函数,并且是 public 或 protected 类型。
-
实体类必须是顶级类。枚举或接口不能成为实体类
-
实体类不能是 final 类型的。实体的方法和变量也不能是 final 的。
-
如果需要远程传输对象,必须实现 Serializable 接口。
我们来看一个最简单的例子:
@Entity public class Book { @Id private Long id; private String title; private Float price; private String description; private String isbn; private Integer nbOfPage; private Boolean illustrations; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public Float getPrice() { return price; } public void setPrice(Float price) { this.price = price; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public Integer getNbOfPage() { return nbOfPage; } public void setNbOfPage(Integer nbOfPage) { this.nbOfPage = nbOfPage; } public Boolean getIllustrations() { return illustrations; } public void setIllustrations(Boolean illustrations) { this.illustrations = illustrations; } }
下图表现实体类与数据库映射关系:
二、基于例外的配置
实体类默认映射规则:
1. 实体类名被映射到相同的数据库表名 ( 如: Book 实体被映射到 BOOK 表 ) 。如果你需要映射到另一个表名,你需要用 @Table 注释。
2. 属性名被映射到相同的列名 ( 如: id 属性,或者 getId() 方法,被映射到一个 ID 的列名 ) 。如果你想要修改默认的映射,你需要使用 @Column 注解。
3.Java 基本数据类型用 JDBC 规则映射数据库数据类型。 String 被映射为 VARCHAR,long 被映射为 BIGINT , Boolean 被映射为 SMALLINT 等等。 String 默认映射的列大小为 255(VARCHAR(255)). 注意,默认映射规则根据不同的数据库而不同。例如: String 在 Mysql 中被映射为为 VARCHAR ,而在 Oracle 中被映射为 VARCHAR2 。 Integer 在 Mysql 中被映射为 INT , Oracle 中被映射为 NUMBER 。
根据这些规则, BOOK 实体类被映射到 Mysql 表,其 DDL 为:
CREATE TABLE `book` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `description` longtext, `illustrations` bit(1) DEFAULT NULL, `isbn` varchar(255) DEFAULT NULL, `nbOfPage` int(11) DEFAULT NULL, `price` float DEFAULT NULL, `title` varchar(255) NOT NULL, PRIMARY KEY (`id`) )