内置注解: 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)。
类级别的注解:
@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注解
热门评论
注解对初学者感觉好难理解。