JPA+Hibernate中常用的注解

JPA+Hibernate中常用的注解

JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体[对象持久化](https://baike.baidu.com/item/对象持久化/7316192)到数据库中。

Sun引入新的JPA ORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。

JPA的总体思想和现有Hibernate、TopLink、JDO等ORM框架大体一致。总的来说,JPA包括以下3方面的技术:

ORM映射元数据

JPA支持XML和JDK5.0注解两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中

API

用来操作实体对象,执行CRUD操作,框架在后台替代我们完成所有的事情,开发者从繁琐的JDBC和SQL代码中解脱出来。

查询语言

这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

其上数据,引自网络: https://baike.baidu.com/item/JPA/5660672?fr=aladdin

常用注解:

1. @Entity
	使用jpa定义一个持久化类是,使用@Entity注解来修饰持久化类,直接写在类名上方即可,每一个持久化类都应实现Serializable接口
       示例:
         @Entity
         public class TestEntity implements Serializable{....}
2. @ID 
    定义某一字段为主键ID,示例:
        @Id
        private String uuid;
     一般情况下,@ID注解不单独使用,而是配合@GeneratedValue使用,示例
        @GeneratedValue
        @Id
        private String uuid;
3. @GenericGenerator 自定义生成主键,主要属性值有
	3.1. name属性指定生成器名称。
	3.2.strategy属性指定具体生成器的类名。
	3.3.parameters得到strategy指定的具体生成器所用到的参数。
	示例:
		@Target({PACKAGE, TYPE, METHOD, FIELD})   
        @Retention(RUNTIME)   
        public @interface GenericGenerator {   
            String name();   
            String strategy();   
            Parameter[] parameters() default {};   
        }  
     @GenericGenerator应用时与@GeneratedValue 同时使用,示例:
     	@GeneratedValue(generator="testXXX")
        @GenericGenerator(name="testXXX",strategy="testABC")
        @Id
        private Integer id;
     注意:其中GeneratedValue的 generator 属性值使用的时 GenericGenerator的name 的属性值
4. @Column 是属性或方法级别的注解,用于指定持久化属性映射到数据库表的列。如果没有指定列注释,则使用其默认值。
参数类型描述
nameString列的名称,默认为属性的名称(Hibernate 映射列时,若遇到驼峰拼写,会自动添加 _ 连接并将大写字母改成小写)。
uniqueboolean列的值是否是唯一的。这是 @UniqueConstraint 注解的一个快捷方式, 实质上是在声明唯一约束。默认值为 false。
nullableboolean列的值是否允许为 null。默认为 true。
insertableboolean列是否包含在 INSERT 语句中,默认为 true。
updatableboolean列是否包含在 UPDATE 语句中,默认为 true。
columnDefinitionString生成列的 DDL 时使用的 SQL 片段。默认使用推断的类型来生成 SQL 片段以创建此列。
tableString当前列所属的表的名称。
lengthint列的长度,仅对字符串类型的列生效。默认为255。
precisionint列的精度,仅对十进制数值有效,表示有效数值的总位数。默认为0。
scaleint列的精度,仅对十进制数值有效,表示小数位的总位数。默认为0。
示例代码:
@Entity(name = "users")
public class Users implements Serializable {
        @Id
        @GeneratedValue
        private Long id;
        @Column(nullable = false, length = 32)
        private String username;
        @Column(length = 128)
        private String mail;
        @Column(columnDefinition = "char(11) NOT NULL")
        private String phone;
        @Column(precision = 5, scale = 2)
            private BigDecimal bigDecimal;
        @Column(precision = 5, scale = 2)
        private double udouble;
        // getters and setters 
}
其上生成的MySQL语句:
	CREATE TABLE `person` (
        `id` bigint( 20) NOT NULL AUTO_INCREMENT,
        `udouble` double NOT NULL,
        `mail` varchar( 128) DEFAULT NULL,
        `username` varchar( 32) NOT NULL,
        `phone` char( 11) NOT NULL,
        `bigDecimal` decimal( 5, 2) DEFAULT NULL,
        PRIMARY KEY ( `id`)
	) ENGINE= InnoDB DEFAULT CHARSET=utf8;
从生成的sql语句中可以看出,bigDecimal 字段的精度控制生效了,但对于double类型的 udouble 字段的精度控制没有生效,让之生效,可以将代码修改为:
          @Column(columnDefinition = "double(5, 2)")
          private double udouble;
再次运行,MySQL代码如下:
    CREATE TABLE `person` (
        `id` bigint( 20) NOT NULL AUTO_INCREMENT,
        `udouble` double( 5, 2) DEFAULT NULL,
        `mail` varchar( 128) DEFAULT NULL,
        `username` varchar( 32) NOT NULL,
        `phone` char( 11) NOT NULL,
        `bigDecimal` decimal( 5, 2) DEFAULT NULL,
        PRIMARY KEY ( `id`)
    ) ENGINE= InnoDB DEFAULT CHARSET=utf8;
    
5. @Table - 映射表名    
参数类型描述
nameString表的名称,默认为实体名称(参考 @Entity 注解的 name 参数说明),因此如果实体名称与映射的表名称一致时,@Table 注解常常可以省略。
catalogString默认为数据库系统缺省的 catalog。
schemaString默认为用户缺省的 schema。
uniqueConstraintsUniqueConstraint[]表的唯一约束(除了由 @Column@JoinColumn 注解指定的约束以及主键的约束之外的约束),通过使用 @UniqueConstraint 注解来声明,仅在允许自动更新数据库表结构的场景中起到作用,默认没有其他额外的约束条件。
indexesIndex[]表的索引,通过使用 @Index 注解来声明,仅在允许自动更新数据库表结构的场景中起到作用,默认没有其他额外的索引。
应用示例:
    @Table(name="test",indexes= {},catalog="XXX",schema="XXXAAA")
    public class Test {.....}
6. @UpdateTimestamp - 更新时自动更新时间,示例:

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name="UPDATETIME")
    @org.hibernate.annotations.UpdateTimestamp
    private Date UPDATETIME; 
	
7. @CreationTimestamp - 创建时自动更新时间

	@Temporal(TemporalType.TIMESTAMP)
  	@Column(updatable = false)
  	@org.hibernate.annotations.CreationTimestamp 
  	private Date CREATETIME; 
  	
8. @Version - 版本号,更新时自动加1
	
	@Version
	private Long version;

9.@NotNull 非空检查
	@NotNull(message="消息内容")
	实体非空注解,但是这个在生成数据库结构时会被忽略,在实体保存校验时起作用。
	要想在数据库中生成非空约束,应该结合 @Column(nullable=false) 或者 @Basic(optional=false)

当然 Jpa中还有许多的注解,这个可以在使用或见到不认识的注解时,百度一下就好了。

只要心有海阔天空,自然风平浪静。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值