注意:
1、使用注解之后要修改hibernate.cfg.xml中的mapping为
<mapping class="com.ma.entity.Dept"/>
2、大多数情况下导javax.persistence包下的注解,当需要使用hibernate特殊功能时需要导入hibernate包
3、尽量写双向关联,并且保证多的一方维护1的一方
@Entity:标识实体类为持久化类,写到类名上面
@Table:设置实体类和数据库关联的表名,写到类名上面,支持自动匹配,但是要求类名和表名一致
name:对应数据库中的表名
例如:@Table(name="`DEPT`")
--------------------以下所有注解都写到属性上-------------------------
@Id:标识实体类中对应表的主键属性。
@GeneratedValue:定义标识属性值的生成策略(某个属性的值如何增长由它定义)
generator:表示主键生成器的名称
strategy:主键生成策略
例如:@GeneratedValue(generator="xl",strategy=GenerationType.SEQUENCE)
@SequenceGenerator:定义序列生成器
allocationSize: 每次主键值增加的大小
initialValue:表示主键初始值,默认为0
name:表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中
sequenceName:表示生成策略用到的数据库序列名称。
例如:@SequenceGenerator(allocationSize=0,initialValue=1,name="xl",sequenceName="tes_seq")
完整主键设置示例:
@Id
@Column(name="`EMPNO`")
private Integer empno;
@Column:将属性映射到列(表中的字段)
name:表示数据库表中该字段的名称,默认情形属性名称一致
nullable - 可选,表示该字段是否允许为 null,默认为 true
unique - 可选,表示该字段是否是唯一标识,默认为 false
length - 可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255.
insertable - 可选,表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为 true
updateable - 可选,表示在ORM 框架执行更新操作时,该字段是否应该出现在UPDATE 语句中,默认为 true.
对于一经创建就不可以更改的字段,该属性非常有用,如对于 birthday字段。
columnDefinition - 可选,表示该字段在数据库中的实际类型。通常ORM 框架可以根据属性类型自动判断数据库中字段的类型,
但是对于Date 类型仍无法确定数据库中字段类型究竟是 DATE,TIME 还是TIMESTAMP.
此外 ,String 的默认映射类型为 VARCHAR, 如果要将 String 类型映射到特定数据库的 BLOB或 TEXT 字段类型,该属性非常有用。
例如:@Column(name="`DEPTNO`")
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient
---------------------------关联映射注解-------------------------
单向@OneToOne:一对一关联映射
@JoinColumn:(外键表对应实体类属性名)
例如:
@OneToOne
@JoinColumn(name="deptno")
private Dept dept;
单向@OneToMany:一对多关联映射
@JoinColumn:指定修饰的集合和当前类关联的外键属性(外键表对应实体类属性名)
例如:
@OneToMany
@JoinColumn(name="deptno")
private Set<Emp> empSet = new HashSet<Emp>();
双向@OneToMany:一对多关联映射
注意:@JoinColumn和@JoinTable以及mappedBy他们是互斥的,一边有了join另一边只能写mappedBy
1 的一方代码如下:Student
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "student")
private Set<Result> results = new HashSet<Result>(0);
其中:
cascade :级联
fetch:是否延迟加载
mappedBy:间接指定外键关系
多的一方代码如下:Result
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "StudentNo", nullable = false)
private Student student;
单向@ManyToOne:多对一关联映射
@JoinColumn:(外键表对应实体类属性名)
例如
@ManyToOne
@JoinColumn(name="deptno")
private Dept dept;
双向@ManyToOne:多对一关联映射---和双向@OneToMany一样
双向@ManyToMany多对多关联映射需要涉及到三张表
注意:如果想显示中间表的数据建议拆成多对一
A主体端 B关联端 C中间表
Student Subject Result
1、在主体端写如下代码
@ManyToMany(fetch = FetchType.EAGER)
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinTable(name = "Result",
joinColumns = {@JoinColumn(name = "StudentNo") },
inverseJoinColumns = { @JoinColumn(name = "SubjectId") })
private Set<Subject> setSubjects = new HashSet<Subject>();
其中:
@ManyToMany: 多对多关联映射
fetch:指定加载方式(FetchType.EAGER:立即加载 FetchType.LAZY:延迟加载)
@Cascade:级联操作
@JoinTable:描述关联表和关联条件
name:中间表表名
joinColumns:写的都是本表在中间表的外键名称,
inverseJoinColumns:写的是另一个表在中间表的外键名称。
2、在关联端写如下代码
@ManyToMany(mappedBy = "setSubjects",fetch=FetchType.LAZY)
private Set<Student> setStudents = new HashSet<Student>();
其中:
@ManyToMany: 多对多关联映射
mappedBy:该参数包含了主体端的属性名,这样就绑定双方的关系
fetch:指定加载方式(FetchType.EAGER:立即加载 FetchType.LAZY:延迟加载)
1、使用注解之后要修改hibernate.cfg.xml中的mapping为
<mapping class="com.ma.entity.Dept"/>
2、大多数情况下导javax.persistence包下的注解,当需要使用hibernate特殊功能时需要导入hibernate包
3、尽量写双向关联,并且保证多的一方维护1的一方
@Entity:标识实体类为持久化类,写到类名上面
@Table:设置实体类和数据库关联的表名,写到类名上面,支持自动匹配,但是要求类名和表名一致
name:对应数据库中的表名
例如:@Table(name="`DEPT`")
--------------------以下所有注解都写到属性上-------------------------
@Id:标识实体类中对应表的主键属性。
@GeneratedValue:定义标识属性值的生成策略(某个属性的值如何增长由它定义)
generator:表示主键生成器的名称
strategy:主键生成策略
例如:@GeneratedValue(generator="xl",strategy=GenerationType.SEQUENCE)
@SequenceGenerator:定义序列生成器
allocationSize: 每次主键值增加的大小
initialValue:表示主键初始值,默认为0
name:表示该表主键生成策略名称,它被引用在@GeneratedValue中设置的“gernerator”值中
sequenceName:表示生成策略用到的数据库序列名称。
例如:@SequenceGenerator(allocationSize=0,initialValue=1,name="xl",sequenceName="tes_seq")
完整主键设置示例:
@Id
@Column(name="`EMPNO`")
private Integer empno;
@Column:将属性映射到列(表中的字段)
name:表示数据库表中该字段的名称,默认情形属性名称一致
nullable - 可选,表示该字段是否允许为 null,默认为 true
unique - 可选,表示该字段是否是唯一标识,默认为 false
length - 可选,表示该字段的大小,仅对 String 类型的字段有效,默认值255.
insertable - 可选,表示在ORM框架执行插入操作时,该字段是否应出现INSETRT语句中,默认为 true
updateable - 可选,表示在ORM 框架执行更新操作时,该字段是否应该出现在UPDATE 语句中,默认为 true.
对于一经创建就不可以更改的字段,该属性非常有用,如对于 birthday字段。
columnDefinition - 可选,表示该字段在数据库中的实际类型。通常ORM 框架可以根据属性类型自动判断数据库中字段的类型,
但是对于Date 类型仍无法确定数据库中字段类型究竟是 DATE,TIME 还是TIMESTAMP.
此外 ,String 的默认映射类型为 VARCHAR, 如果要将 String 类型映射到特定数据库的 BLOB或 TEXT 字段类型,该属性非常有用。
例如:@Column(name="`DEPTNO`")
@Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性,如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient
---------------------------关联映射注解-------------------------
单向@OneToOne:一对一关联映射
@JoinColumn:(外键表对应实体类属性名)
例如:
@OneToOne
@JoinColumn(name="deptno")
private Dept dept;
单向@OneToMany:一对多关联映射
@JoinColumn:指定修饰的集合和当前类关联的外键属性(外键表对应实体类属性名)
例如:
@OneToMany
@JoinColumn(name="deptno")
private Set<Emp> empSet = new HashSet<Emp>();
双向@OneToMany:一对多关联映射
注意:@JoinColumn和@JoinTable以及mappedBy他们是互斥的,一边有了join另一边只能写mappedBy
1 的一方代码如下:Student
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "student")
private Set<Result> results = new HashSet<Result>(0);
其中:
cascade :级联
fetch:是否延迟加载
mappedBy:间接指定外键关系
多的一方代码如下:Result
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "StudentNo", nullable = false)
private Student student;
单向@ManyToOne:多对一关联映射
@JoinColumn:(外键表对应实体类属性名)
例如
@ManyToOne
@JoinColumn(name="deptno")
private Dept dept;
双向@ManyToOne:多对一关联映射---和双向@OneToMany一样
双向@ManyToMany多对多关联映射需要涉及到三张表
注意:如果想显示中间表的数据建议拆成多对一
A主体端 B关联端 C中间表
Student Subject Result
1、在主体端写如下代码
@ManyToMany(fetch = FetchType.EAGER)
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE})
@JoinTable(name = "Result",
joinColumns = {@JoinColumn(name = "StudentNo") },
inverseJoinColumns = { @JoinColumn(name = "SubjectId") })
private Set<Subject> setSubjects = new HashSet<Subject>();
其中:
@ManyToMany: 多对多关联映射
fetch:指定加载方式(FetchType.EAGER:立即加载 FetchType.LAZY:延迟加载)
@Cascade:级联操作
@JoinTable:描述关联表和关联条件
name:中间表表名
joinColumns:写的都是本表在中间表的外键名称,
inverseJoinColumns:写的是另一个表在中间表的外键名称。
2、在关联端写如下代码
@ManyToMany(mappedBy = "setSubjects",fetch=FetchType.LAZY)
private Set<Student> setStudents = new HashSet<Student>();
其中:
@ManyToMany: 多对多关联映射
mappedBy:该参数包含了主体端的属性名,这样就绑定双方的关系
fetch:指定加载方式(FetchType.EAGER:立即加载 FetchType.LAZY:延迟加载)