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 是属性或方法级别的注解,用于指定持久化属性映射到数据库表的列。如果没有指定列注释,则使用其默认值。
参数 类型 描述
name String 列的名称,默认为属性的名称(Hibernate 映射列时,若遇到驼峰拼写,会自动添加 _ 连接并将大写字母改成小写)。
unique boolean 列的值是否是唯一的。这是 @UniqueConstraint 注解的一个快捷方式, 实质上是在声明唯一约束。默认值为 false。
nullable boolean 列的值是否允许为 null。默认为 true。
insertable boolean 列是否包含在 INSERT 语句中,默认为 true。
updatable boolean 列是否包含在 UPDATE 语句中,默认为 true。
columnDefinition String 生成列的 DDL 时使用的 SQL 片段。默认使用推断的类型来生成 SQL 片段以创建此列。
table String 当前列所属的表的名称。
length int 列的长度,仅对字符串类型的列生效。默认为255。
precision int 列的精度,仅对十进制数值有效,表示有效数值的总位数。默认为0。
scale int 列的精度,仅对十进制数值有效,表示小数位的总位数。默认为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 - 映射表名    
参数 类型 描述
name String 表的名称,默认为实体名称(参考 @Entity 注解的 name 参数说明),因此如果实体名称与映射的表名称一致时,@Table 注解常常可以省略。
catalog String 默认为数据库系统缺省的 catalog。
schema String 默认为用户缺省的 schema。
uniqueConstraints UniqueConstraint[] 表的唯一约束(除了由 @Column@JoinColumn 注解指定的约束以及主键的约束之外的约束),通过使用 @UniqueConstraint 注解来声明,仅在允许自动更新数据库表结构的场景中起到作用,默认没有其他额外的约束条件。
indexes Index[] 表的索引,通过使用 @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中还有许多的注解,这个可以在使用或见到不认识的注解时,百度一下就好了。

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

posted @ 2021-03-02 18:03  靳`则生  阅读(145)  评论(0)    收藏  举报