spring boot学习笔记之spring-data-jpa总结

一、名称优于配置

Dao层无需具体实现,但需特别注意Dao层方法的命名规则。

二、JPA之@Entity、@Table、@Column、@Id

原文链接:https://www.cnblogs.com/xuwenjin/p/8830850.html

注解所在包:javax.persistence

Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库。
这些普通Java对象被称作Entity Bean。
除了是用Java Persistence元数据将其映射到数据库外,Entity Bean与其他Java类没有任何区别。
事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity Bean时,容器会自动将Entity Bean的状态和数据库同步。

Java Persistence API还定义了一种查询语言(JPQL),具有与SQL相类似的特征,只不过做了裁减,以便处理Java对象而非原始的关系表。

注意:在Hibernate中也有@Entity和Table这两个注解,但是其中@Entity注解已经废弃,所以本文只分析JPA下的注解


首先看看个例子:

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 = "xwj_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 = "xwj_user")

      或者

      @Entity
      @Table(name = "xwj_user", schema = "test")

      查看@Entity注解,发现其只有一个属性name,表示其所对应的数据库中的表名

  @Table 当实体类与其映射的数据库表名不同名时需要使用 @Table注解说明,该标注与 @Entity 注解并列使用,置于实体类声明语句之前,可写于单独语句行,也可与声明语句同行。
      @Table注解的常用选项是 name,用于指明数据库的表名
      @Table注解还有两个选项 catalog 和 schema 用于设置表所属的数据库目录或模式,通常为数据库名

如果缺省@Table注解,则class字段名即表中的字段名,所以需要@Column注解来改变class中字段名与db中表的字段名的映射规则:

@Column注释定义了将成员属性映射到关系表中的哪一列和该列的结构信息,属性如下:
  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注解:

@Id注释指定表的主键,它可以有多种生成方式:
  1)TABLE:容器指定用底层的数据表确保唯一;
  2)SEQUENCE:使用数据库德SEQUENCE列莱保证唯一(Oracle数据库通过序列来生成唯一ID);
  3)IDENTITY:使用数据库的IDENTITY列莱保证唯一;
  4)AUTO:由容器挑选一个合适的方式来保证唯一;
  5)NONE:容器不负责主键的生成,由程序来完成。

其中与@Id一起使用的还有另外两个注解:@GeneratedValue、@GenericGenerator:

三、GeneratedValue与GenericGenerator的区别

原文链接:https://blog.csdn.net/u011781521/article/details/72210980


@GeneratorValue注解----JPA通用策略生成器

@GenericGenerator注解----自定义主键生成策略
一个是通用的一个是自定义的这就是他们的区别。


四、@GeneratorValue注解----JPA通用策略生成器


GeneratorValue属于一个JPA接口,其接口下包含了两个抽象的参数,GenerationType类型的strategy和String类型的generator,并且两个参数都有相应的默认值。
 

@Target({METHOD,FIELD})    
 
    @Retention(RUNTIME)    
 
    public @interface GeneratedValue{    
 
        GenerationType strategy() default AUTO;    
        String generator() default "";    
 
    }   

五、@GenericGenerator注解----自定义主键生成策略


GenericGenerator一般配合GeneratorValue来用比如说
Java代码  :

@Id
@GeneratedValue(GenerationType.AUTO) 

 

可以用hibernate特有以下用法来实现
Java代码 :

@GeneratedValue(generator = "paymentableGenerator")    
@GenericGenerator(name = "paymentableGenerator", strategy = "assigned")  


@GenericGenerator的定义:

@Target({PACKAGE, TYPE, METHOD, FIELD})  
 
@Retention(RUNTIME)  
 
public @interface GenericGenerator {  
 
 /**
  * unique generator name 
  */  
 String name();  

 /** 
  * Generator strategy either a predefined Hibernate 
  * strategy or a fully qualified class name. 
  */  
 String strategy();  
 
 /** 
  * Optional generator parameters 
  */  
 Parameter[] parameters() default {};  
 
}  


name属性指定生成器名称。
strategy属性指定具体生成器的类名。
parameters得到strategy指定的具体生成器所用到的参数。


有以下参数可选:
  

static {  
  GENERATORS.put("uuid", UUIDHexGenerator.class);  
  GENERATORS.put("hilo", TableHiLoGenerator.class);  
  GENERATORS.put("assigned", Assigned.class);  
  GENERATORS.put("identity", IdentityGenerator.class);  
  GENERATORS.put("select", SelectGenerator.class);  
  GENERATORS.put("sequence", SequenceGenerator.class);  
  GENERATORS.put("seqhilo", SequenceHiLoGenerator.class);  
  GENERATORS.put("increment", IncrementGenerator.class);  
  GENERATORS.put("foreign", ForeignGenerator.class);  
  GENERATORS.put("guid", GUIDGenerator.class);  
  GENERATORS.put("uuid.hex", UUIDHexGenerator.class); //uuid.hex is deprecated  
  GENERATORS.put("sequence-identity", SequenceIdentityGenerator.class);  
}  


上面十二种策略,加上native,hibernate一共默认支持十三种生成策略。


六、两种数据库支持情况

数据库名称支持的id策略
MySQLGenerationType.TABLE
GenerationType.AUTO
GenerationType.IDENTITY
不支持GenerationType.SEQUENCE
Oraclestrategy=GenerationType.AUTO
GenerationType.SEQUENCE
GenerationType.TABLE
不支持GenerationType.IDENTITY

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值