手记

Thinking in java 基础之注解

Thinking in java 基础之注解

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

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

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

  • @Override,表示当前的方法定义将覆盖超类中的方法。
  • @Deprecated,使用了注解为它的元素编译器将发出警告,因为注解@Deprecated是不赞成使用的代码,被弃用的代码。
  • @SuppressWarnings,关闭不当编译器警告信息。
    元注解:Java.lang.Annotation包中(4个)

    上面这三个注解我们多少都会在写代码的时候遇到。另外,Java还提供了4个元注解(meta-annotation类型,在Java.lang.annotation包中),专门负责新注解的创建,用来对其它 annotation类型作说明。专门负责注解其他的注解,分别如下
    1.@Target,(使用到枚举类型ElementType)
     2.@Retention,(使用到枚举类RetentionPolicy)
     3.@Documented,
     4.@Inherited
    @Target元注解,默认值为任何元素,表示该注解用于什么地方。

    可用的ElementType参数包括

    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元注解,表示需要在什么级别保存该注释信息(生命周期)。

可选的RetentionPoicy参数包括:

RetentionPolicy.SOURCE: 停留在java源文件,编译器被丢掉
RetentionPolicy.CLASS:停留在class文件中,但会被VM丢弃(默认)
RetentionPolicy.RUNTIME:内存中的字节码,VM将在运行时也保留注解,因此可以通过反射机制读取注解的信息。参考反射基础 Thinking in java基础之反射
@Documented将注解包含在JavaDoc中

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

  下面看一下具体的实现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<Student>属性)

  • 一方(School):

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

  • 多方(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]

注意:连接表的表名要相同,列名要相同。

一共三种情况的注解:java实现,第三方实现,自己实现。同时,更多的时候配合反射使用,那样才能产生好的效果。

参考文献

官方API
hibernate注解(二)
Hibernate初探之单表映射
Hibernate注解
JAVA 注解的几大作用及使用方法详解
java中注解的使用与实例(一)
全面解析Java注解

11人推荐
随时随地看视频
慕课网APP

热门评论

注解对初学者感觉好难理解。

查看全部评论