JPA实体类中的注解

JPA实体类中的注解

学习JPA时,实体类中的注解是必须指导和理解的,现在把所有常用的注解按照自己的理解整理一下 。

首先认识一下什么是JPA

JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
JPA由EJB 3.0软件专家组开发,作为JSR-220实现的一部分。但它不囿于EJB 3.0,你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范.
JPA的总体思想和现有Hibernate、TopLink,JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:
(1)ORM映射元数据
JPA支持XML和JDK 5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中;
(2)JPA 的API
用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。
(3)查询语言
这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

下面总结一下JPA中常用的注解标签
  1. @Entity
    @Entity标记在类名上面,作为实体类的标识
  2. @Table
    当实体类与其映射的数据库表名不同名时需要使用 @Table 标注说明,该标注与 @Entity 标注并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。
    @Table 标注的常用选项是 name,用于指明数据库的表名
    @Table标注还有一个两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名。uniqueConstraints选项用于设置约束条件,通常不须设置。
  3. @Id
    @Id设置对象表示符,标识的实体类的属性映射对应表中的主键
  4. @GeneratedValue
    设置标识符的生成策略,常与@Id一起使用
    参数:strategy指定具体的生成策略
    方式一:@GeneratedValue(strategy=GenerationType.AUTO) 也是默认策略, 即写成@GeneratedValue也可;
    类似于hibernate的native策略,生成方式取决于底层的数据库。
    方式二:@GeneratedValue(strategy = GenerationType.IDENTITY)指定“自动增长”策略,适用于MySQL;
    方式三:@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “seq_tbl_person”)指定“序列”策略,常用于Oracle,其中generator表示生成器的名字。而且还要指定@SequenceGenerator(name = “seq_tbl_person”, sequenceName = “seq_tbl_person”, allocationSize = 1)注解配合使用
    其中name指定生成器的名字(与generator的值一样),sequenceName指定数据库中定义序列的名字,allocationSize指定序列每次增长1
  5. @Column
    描述数据库表中该字段的定义,具有一下属性
    name:表示数据库表中该字段的名称,默认情形属性名称一致。
    nullable:表示该字段是否允许为null,默认为true。
    unique:表示该字段是否是唯一标识,默认为false。
    length:表示该字段的大小,仅对String类型的字段有效。
    insertable:表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为true。
    updateable:表示在ORM框架执行更新操作时,该字段是否应该出现在UPDATE语句中,默认为true。对于一经创建就不可以更改的字段,该属性非常有用,如对于birthday字段。
    columnDefinition:表示该字段在数据库中的实际类型。通常ORM框架可以根据属性类型自动判断数据库中字段的类型,但是对于Date类型仍无法确定数据库中字段类型究竟是DATE,TIME还是TIMESTAMP。此外,String的默认映射类型为VARCHAR,如果要将String类型映射到特定数据库的BLOB或TEXT字段类型,该属性非常有用。
  6. @OrderBy
    在加载数据的时候可以为其指定顺序。
  7. @Transient
    表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。
    如果一个属性并非数据库表的字段映射。就务必将其标示为@Transient。否则。ORM框架默认其注解为@Basic
  8. @OneToOne
    描述一个一对一的关联
    可选
    fetch:表示抓取策略,默认为FetchType.LAZY
    cascade:表示级联操作策略
  9. @ManyToOne
    表示一个多对一的映射,该注解标注的属性通常是数据库表的外键
    optional:是否允许该字段为null,该属性应该根据数据库表的外键约束来确定,默认为true
    可选
    fetch:表示抓取策略,默认为FetchType.EAGER
    cascade:表示默认的级联操作策略,可以指定为ALL,PERSIST,MERGE,REFRESH和REMOVE中的若干组合,默认为无级联操作
    targetEntity:表示该属性关联的实体类型。该属性通常不必指定,ORM框架根据属性类型自动判断targetEntity。
  10. @OneToMany
    描述一个一对多的关联,该属性应该为集体类型,在数据库中并没有实际字段。
    fetch:表示抓取策略,默认为FetchType.LAZY,因为关联的多个对象通常不必从数据库预先读取到内存
    可选
    cascade:表示级联操作策略,对于OneToMany类型的关联非常重要,通常该实体更新或删除时,其关联的实体也应当被更新或删除
    例如:实体User和Order是OneToMany的关系,则实体User被删除时,其关联的实体Order也应该被全部删除
  11. @ManyToMany
    描述一个多对多的关联.多对多关联上是两个一对多关联,但是在ManyToMany描述中,中间表是由ORM框架自动处理
    可选
    targetEntity:表示多对多关联的另一个实体类的全名,例如:package.Book.class
    mappedBy:表示多对多关联的另一个实体类的对应集合属性名称
    两个实体间相互关联的属性必须标记为@ManyToMany,并相互指定targetEntity属性,
    需要注意的是,有且只有一个实体的@ManyToMany注解需要指定mappedBy属性,指向targetEntity的集合属性名称
    利用ORM工具自动生成的表除了User和Book表外,还自动生成了一个User_Book表,用于实现多对多关联
  12. @JoinColumn
    可选
    @JoinColumn和@Column类似,介量描述的不是一个简单字段,而一一个关联字段,例如.描述一个@ManyToOne的字段.
    name:该字段的名称.由于@JoinColumn描述的是一个关联字段,如ManyToOne,则默认的名称由其关联的实体决定.
    例如,实体Order有一个user属性来关联实体User,则Order的user属性为一个外键,
    其默认的名称为实体User的名称+下划线+实体User的主键名称
    @JoinTable(name = “student_teacher”, inverseJoinColumns = @JoinColumn(name = “tid”), joinColumns = @JoinColumn(name = “sid”))
    可选
    由第三张表来维护两张表的关系
    name:是关系表的名字
    joinColumns:自己这一端的主键
    inverseJoinColumns:对方的主键
  13. @MappedSuperclass
    可选
    @MappedSuperclass可以将超类的JPA注解传递给子类,使子类能够继承超类的JPA注解
  14. @Embedded
    @Embedded将几个字段组合成一个类,并作为整个Entity的一个属性.
    例如User包括id,name,city,street,zip属性.
    我们希望city,street,zip属性映射为Address对象.这样,User对象将具有id,name和address这三个属性.
    Address对象必须定义为@Embededable

其他具体注解了解

点击了解更多

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值