一个普通的POJO类通过标注@Entity可以映射成为可持久化的类,可持久化的类可以对应数据库中的数据。映射成为实体类要依赖一些特定的规则。
1、映射实体(@Entity)
标注为@Entity注释的类,表示该类是一个可持久化的类,当在容器中时,服务器将会首先加载所有标注了@Entity注释的实体类,例如:
1 | @Entity | |
2 | public class ContaceEO { |
3 | ... | |
4 | ContactEO() {...} |
5 | ... | |
6 | } |
@Entity注释的定义的属性如下:
1 | @Target(TYPE) @Retention(RUNTIME) | |
2 | public @interface Entity { |
3 | String name() default ""; | |
4 | } |
其中name属性表示实体的名字,若不作设置,默认为标注实体类的名称。
注:标注为@Entity的实体类至少要有一个无参的构造方法。
2、标注主键(@Id)
用于标注实体类中关联数据库的主键
3、映射表(@Table)、映射方法和属性(@Column)
如下表结构:
1 | create table contact ( | |
2 | id int(20) not null, |
3 | name varchar(50) default null, | |
4 | ) |
实体类代码改为:
01 | @Entity | |
02 | @Table(name="contact") |
03 | public class ContactEO implements java.io.Serializable { | |
04 | @Id |
05 | private Integer id; | |
06 |
|
07 | @Column(name="name") | |
08 | private String name; |
09 |
| |
10 | //省略get、set方法 |
11 | } |
@Table的属性定义如下:
1 | @Target({TYPE}) @Retention(RUNTIME) | |
2 | public @interface Table { |
3 | String name() default ""; | |
4 | String catalog() default ""; |
5 | String schema() default ""; | |
6 | UniqueConstraint[] uniqueConstraints() default {}; |
7 | } |
要注意一下几个问题:
a、该标记要在类前面
b、name属性表示实体对应的表的名称
c、catalog和shema属性表示实体指定的目录名或数据库名
d、uniqueConstraints标记属性表示该实体所关联的唯一约束条件,一个实体可以有多个唯一约束条件
1 | @Entity | |
2 | @Table(name="contact", uniqueConstraints = { |
3 | @UniqueConstraint(columnNames = {"name", "email"}) | |
4 | }) |
表示指定表的name和email字段为唯一表示,也就是说不能同时存在完全相同的name和email值的记录,相当于sql中:
1 | ... | |
2 | unique key name_email (name,email) |
@Column标记的属性定义如下:
01 | @Target({METHOD,FIELD}) @Retention(RUNTIME) | |
02 | public @interface Column { |
03 | String name() default ""; | |
04 | boolean unique() default false; |
05 | boolean nullable() default true; | |
06 | boolean insertable() default true; |
07 | boolean updateable() default true; | |
08 | String columnDefinition() default ""; |
09 | String table() default ""; |
10 | int length() default 255; |
11 | int precision() default 0; | |
12 | int scale() default 0; |
13 | } |
使用@Column标记要注意几个问题:
a、此标记可以标注在getter方法前或属性前
b、unique属性表示该字段是否是唯一标识,默认为false
c、columnDefinition属性表示创建表时,该字段创建的SQL语句,一般用于通过Entity生成表定义时使用。
d、table属性表示当映射多个表时,指定表的表中的字段。
e、precision属性和scale属性表示精度,当字段类型为double时,precision表示数值的总长度,scale表示小数点所占的位数。
例如:自定义CLOB类型字段的SQL语句,代码如下:
1 | @Column(name="constact_name", columnDefinition="clob not null") | |
2 | private String name; |
生成的SQL语句如下:
1 | create table contact ( | |
2 | id int not null; |
3 | contact_name clob(200) not null; | |
4 | primary key (id) |
5 | ) |
4、可持久化的基础数据类型
(1)Java基础类型:byte, int, short, long, boolean, char, float, double
(2)Java基础数据类型对应的封装类: Byte, Integer,Short, Long, Boolean, Character, Float, Double
(3)字节和字符型数组: byte[], Byte[],char[], Character[]
(4)大数值类型: java.math.BigInteger, java.math.BigDecimal
(5)字符串类型:String
(6)时间日期类型:java.util.Date, java.util.Calendar, java.sql.Date,java.sql.Time, java.sql.TimeStamp
(7)枚举类型:用户定义的枚举类型
(8)Entity类型:标注为@Entity的类
(9)包含Entity类型的集合Collection类:java.util.Collection, java.util.List, java.util.Map
(10)嵌入式(embeddable)类
1 | @Target({METHOD, FIELD}) @Retention(RUNTIME) | |
2 | public @interface Basic { |
3 | FetchType fetch() default EAGER; | |
4 | boolean optional() default true; |
5 | } |