一、怎样映射一个实体
一个实体就是简单 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`)
)