@Entity、@Table、@Column、@Id、@PropertyDef的见解

网上很多文章讲@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 }

鉴于眼界与学识的不足,此篇仅作为学习路上的记录,不足之处,请各位大牛指正!

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值