Thinking in java 基础之注解

  上半部分源码分析,下半部分具体实现

  内置注解: java.lang包中(3个)

  注解的语法比较简单,除了@符号的使用之外,它基本与Java固有语法一致。Java SE1.5内置了三种标准注解:

  @Override,表示当前的方法定义将覆盖超类中的方法。

  


  @Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。

  

Thinking in java 基础之注解_第1张图片


  @SuppressWarnings,关闭不当编译器警告信息。

  

Thinking in java 基础之注解_第2张图片


  元注解:Java.lang.Annotation包中(4个)

  上面这三个注解我们多少都会在写代码的时候遇到。另外,Java还提供了4个元注解(meta-annotation类型,在Java.lang.annotation包中),专门负责新注解的创建,用来对其它 annotation类型作说明。专门负责注解其他的注解,分别如下

  1.@Target,(使用到枚举类型ElementType)

  2.@Retention,(使用到枚举类RetentionPolicy)

  3.@Documented,

  4.@Inherited

  @Target元注解,默认值为任何元素,表示该注解用于什么地方。

  

Thinking in java 基础之注解_第3张图片


  可用的ElementType参数包括

  

Thinking in java 基础之注解_第4张图片


  ElementType.TYPE: 类、接口(包括注解类型)或enum声明class,interface,@interface,enum 关键字

  ElementType.FIELD: 成员变量、对象、属性(包括enum实例)

  ElementType.METHOD: 方法声明

  ElementType.PARAMETER: 参数声明

  ElementType.CONSTRUCTOR: 构造器声明

  ElementType.LOCAL_VARIABLE: 局部变量声明

  ElementType.ANNOTATION_TYPE, 注解类型声明

  ElementType.PACKAGE: 包声明

  @Retention元注解,表示需要在什么级别保存该注释信息(生命周期)。

  

Thinking in java 基础之注解_第5张图片


  可选的RetentionPoicy参数包括:

  

Thinking in java 基础之注解_第6张图片


  RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉

  RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)

  RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息。参考反射基础 Thinking in java基础之反射

  @Documented将注解包含在JavaDoc中

  

Thinking in java 基础之注解_第7张图片


  @Inheried允许子类继承父类中的注解

  

Thinking in java 基础之注解_第8张图片


  下面看一下具体的实现JPA(Java Persistence API)。

  第三方注解实现:JPA重点总结

  类级别的注解:

  @Entity(name=””)

  @Table(name=””catalog=””schema=””)

  @Embeddable组件

  属性级别的注解:

  属性上或者getXXX()最好统一在一个上面

  @Id(多个Id属性要实现implements Serializable)

  @SequenceGenerator

  @GeneratedValue(strategy=GenerationType.AUTO,generator=””)

  Int:GenerationType.AUTO(默认),GenerationType.INDENTITY, GenerationType.SEQUENCE, GenerationType.TABLE

  Hibernate注解:指定generator=”sid”的话,(@GenericGenerator(strategy=assigned,name=sid)

  @Column(length=长度,name=”列名”,)nullable,unique,insertable,updateable

  @Embedded(和@Embeddable对应)

  @EmbeddedId(组件作为主键)

  @Transient(持久化的时候,忽略此属性)默认为@Basic

  @Basic默认的时候,全部属性都持久化

  @Lob大数据图片,大段文字等

  @Version 乐观锁

  @Temporal 时间格式(TemporalType.DATA,Temporal.TIME,Temporal. TIMESTAMP)

  @Enumerated 枚举类型(EnumType.ORDINAL,EnumType.STRING)

  集合相关Set List Map

  三种情况

  集合中是一般类型(String,date等用@ElementCollection),

  组件类型(@Embeddable修饰的类,用@ElementCollection),

  实体类型(@Entity修饰的类,属于实体,用关联映射)

  @ElementCollection/@OneToMany/@ManyToOne/@OneToOne/@ManyToMany必须要加参数(targetEntity=String.class等)

  因为集合是一对多,需要用表@CollectionTable示例:

  @CollectionTable(name=”表名”, joinColumns=@JoinColumn(name=”本实体的主键”,nullable=true))

  @OrderColumn(name=””) (在新表里面)

  @MapKeyColumn(name=””) (在新表里面)

  和@Column很类似

  @MapKeyClass(String.class) Map键的类型

  关联映射实体对实体(@Entity修饰的持久化类)

  实体映射关系:

  级联关系:cascade:

  cascade=CascadeType.ALL

  cascade=CascadeType.PERSIST

  cascade=CascadeType.MERGE

  cascade=CascadeType.REMOVE

  cascade=CascadeType.REFRESH

  cascade=CascadeType.DETACH

  ALL,PERSIST,MERGE,REMOVE,REFRESH,DETACH

  抓取策略:fetch:

  fetch=FetchType.EAGER 及时抓取(默认)

  fetch=FetchType.LAZY 延时抓取(一对多一定要延时,大数据一定要延时)

  具体事例(三种情况,一对一,一对多,多对多)

  (Person IdCard一个人一个身份证)

  一对一单向外键关联关系:(Person为主控方)

  @OneToOne

  @JoinColumn(name=”本表中添加的一列IdCard_id”, referencedColumnName=”引用IdCard表中的IdCard_id”,unique=true)

  在主表中加一列(Person为主表)

  一对一双向外键关联关系:

  主控方:(Person)

  @OneToOne

  @JoinColumn(name=” 本表中添加的一列IdCard_id”, referencedColumnName=” 引用IdCard表中的IdCard_id”,unique=true)

  被控方(IdCard):@OneToOne(mapping=”关系由Person控制,IdCard”)

  被控方有主控方的引用

  (School Student 一个学校有多名学生,每一名学生此时属于一个学校)正常情况下(多方持有一方的引用,一方有List属性)

  一方(School):

  @OneToMany(targetEntity=Student.class,mappedBy=school(多方的引用的名字),fetch=FetchType.LAZY)

  List

  多方(Student):

  @ManyToOne(targetEntity=School.class)

  @JoinColumn(name=”本实体的列school_id”, referencedColumnName=”引用的列,School中的school_id”,nullable=true(不能为空))

  (Student Course每个学生可以修多门课程,每个课程可以由多个学生选)

  必须加中间表来维护两个实体的关系

  Student:

  @ManyToMany(targetEntity=Course.class)

  @JoinTable(name=student_course,joinColumns=@JoinColumn(name=连接表的列名student_id,referencedColumnName=本实体对应的列名student_id ),inverseJoinColumns=@JoinColumn(name=关联实体在本连接表的列名course_id,referencedColumnName=关联实体的列名course_id))

  Set[Course]

  Course:

  @ManyToMany(targetEntity=Student.class)

  @JoinTable(name=student_course,joinColumns=@JoinColumn(name=连接表的列名course_id,referencedColumnName=本实体对应的列名course_id),inverseJoinColumns=@JoinColumn(name=关联实体在本连接表的列名student_id,referencedColumnName=关联实体的列名student_id))

  Set [Student]