网上很多文章讲@Entity、@Table、@Column、@Id、@PropertyDef注解是Hibernate或Spring或JPA的注解。甚至很多文章直接这样命名,显然这是对这些注解出处理解的偏驳,实为不妥。
@Entity、@Table注解都是Java Persistence API定义的一种注解,这些注解必须遵循Java Persistence API中定义的一种查询语言(JPQL)。这些注解是在JDK5以后支持的元数据注解。
@Entity
@Entity标明这个class是实体类(POJO),并且使用默认的ORM映射规则(即class类名即为数据库中表名,class中属性名对应数据表中字段名)。
一、映射关系:
1、实体类必须用 @javax.persistence.Entity 进行注解。
2、必须使用 @javax.persistence.Id 来注解一个主键
3、实体类必须拥有一个 public 或者 protected 的无参构造函数,之外实体类还可以拥有其他的构造函数;
4、实体类不能是 final 类型的,也不能有 final 类型的方法;
5、如果实体类的一个实例需要用传值的方式调用(例如,远程调用),则这个实体类必须实现(implements)java.io.Serializable 接口。
二、用法解释:
1、若实体类未UserEntity则@Entity不适用name标识时,默认对应数据表user_entity。
2、当然也可以使用@Entity(name=“nb_user”),来对应和实体类不同名的数据表。
3、使用在class类上。
@Table
一、映射关系:
1、若无@Table注解,则class类中属性名即对应数据表中字段名。
2、@Table有属性name,实用来指定和实体类对应的数据表名。
3、如果同时使用了 @Entity(name=“student”) 和 @Table(name=“students”),最终的对应的表名是 students,这说明优先级:@Table > @Entity。
4、使用在class类上。
@column
一、映射关系:
1、该注释定义了class属性名和数据表中字段名的映射关系,
2、name属性用来标识在数据表中对应的字段名。
3、unique标识此字段是否唯一。nullable:是否允许为空。length:对于字符型字段,标识此字段的长度。
4、使用在class属性上或者get方法上
@Id
一、映射关系:
1、标识表的主键:
2、主键生成策略:GenerationType.TABLE、GenerationType.SEQUENCE、GenerationType.IDENTITY、GenerationType.AUTO;
@PropertyDef
1、属性label为字段在数据表中字段的注释
2、@PropertyDef(label=“用户姓名”)
package com.xwj.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;、
import org.hibernate.annotations.GenericGenerator;
@Entity
@Table(name = "nb_user", schema = "test")
public class UserEntity {
@Id
@GeneratedValue(generator = "system-uuid")
@GenericGenerator(name = "system-uuid", strategy = "uuid")
@Column(name = "ID", unique = true, nullable = false, length = 32)
private Integer id;
@Column(name = "last_name")
private String lastName;
@Column(name = "email", length = 32)
private String email;
//TODO get和set方法略...
}
一、@Entity:
表明该类 (UserEntity) 是一个实体类,它默认对应数据库中的表名是user_entity。这里也可以写成
@Entity(name = "nb_user")
或者
@Entity
@Table(name = "nb_user")
二、@Table:
当实体类和对应的数据库表名不同时需要使用 @Table来映射class类名和数据表名。
@Table属性:
1、name,用于指明数据库的表名
2、catalog、schema 用于设置表所属的数据库目录或模式,常数据库名
三、@Column:
标识了class类属性和数据库表字段映射关系。
属性如下:
(1)name:映射的列名。如:映射tbl_user表的name列,可以在name属性的上面或getName方法上面加入;
(2)unique:是否唯一;
(3)nullable:是否允许为空;
(4)length:对于字符型列,length属性指定列的最大字符长度;
(5)insertable:是否允许插入;
(6)updatetable:是否允许更新;
(7)columnDefinition:定义建表时创建此列的DDL;
(8)secondaryTable:从表名。如果此列不建在主表上(默认是主表),该属性定义该列所在从表的名字
四、@Id:
@Id注释指定表的主键,它可以有多种生成方式:
1)TABLE:容器指定用底层的数据表确保唯一;
2)SEQUENCE:使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID);
3)IDENTITY:使用数据库的IDENTITY列莱保证唯一;
4)AUTO:由容器挑选一个合适的方式来保证唯一;
5)NONE:容器不负责主键的生成,由程序来完成。
其中与@Id一起使用的还有另外两个注解:@GeneratedValue、@GenericGenerator,具体使用方法可参考hibernate中的@GeneratedValue与@GenericGenerator
五、@Transitent:
当POJO有属性不需要映射的时候一定要用@Transitent修饰,该注释表示此属性与表没有映射关系,只是一个暂时的属性。
六、声明关联关系:
1、一对多
2、多对一
3、多对多
实例:(商品:Goods,分类Category。两者是多对一的关联关系。)
1
2
3 @Entity
4 @Table(name = "goods", catalog = "test")
5 public class Goods implements java.io.Serializable {
6
7 private static final long serialVersionUID = 1L;
8 private String goodsId;
9 private Category category;
10 private String goodsName;
11
12 public Goods() {
13 }
14
15 /*
16 * 主键
17 * 生成策略为自动增长
18 * 唯一、长度为20
19 */
20 @Id
21 @GeneratedValue
22 @Column(name = "goods_id", unique = true, nullable = false, length = 20)
23 public String getGoodsId() {
24 return this.goodsId;
25 }
26
27 public void setGoodsId(String goodsId) {
28 this.goodsId = goodsId;
29 }
30
31 /*
32 * 多对一关联关系
33 * 延迟加载:fetch = FetchType.LAZY
34 * 引用外键:category_id
35 *
36 */
37 @ManyToOne(fetch = FetchType.LAZY,cascade=CascadeType.ALL)
38 @JoinColumn(name = "category_id")
39 public Category getCategory() {
40 return this.category;
41 }
42
43 public void setCategory(Category category) {
44 this.category = category;
45 }
46
47 @Column(name = "goods_name", nullable = false, length = 50)
48 public String getGoodsName() {
49 return this.goodsName;
50 }
51
52 public void setGoodsName(String goodsName) {
53 this.goodsName = goodsName;
54 }
55
56 }
Category.java
1 @Entity
2 @Table(name = "category", catalog = "test")
3 public class Category implements java.io.Serializable {
4
5 private static final long serialVersionUID = -1877960009126534682L;
6
7 private String categoryId;
8 private String categoryName;
9 private Set<Goods> goodses = new HashSet<Goods>(0);
10
11 public Category() {
12 }
13
14 /*
15 * 主键
16 * 生成策略为自动增长
17 * 唯一、长度为20
18 */
19 @Id
20 @GeneratedValue
21 @Column(name = "category_id", unique = true, length = 10)
22 public String getCategoryId() {
23 return this.categoryId;
24 }
25
26 public void setCategoryId(String categoryId) {
27 this.categoryId = categoryId;
28 }
29
30 @Column(name = "category_name", length = 20)
31 public String getCategoryName() {
32 return this.categoryName;
33 }
34
35 public void setCategoryName(String categoryName) {
36 this.categoryName = categoryName;
37 }
38
39 /*
40 * 一对多关联关系
41 * 级联关系:cascade=CascadeType.ALL
42 * 延迟加载:fetch = FetchType.LAZY
43 * 映射:mappedBy = "category"
44 */
45 @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "category")
46 public Set<Goods> getGoodses() {
47 return this.goodses;
48 }
49
50 public void setGoodses(Set<Goods> goodses) {
51 this.goodses = goodses;
52 }
53
54 }