Hibernate的基本注解
1 基础实体类注解
@Entity注解
在实体上面写上 @Entity(name=”t_student”)
在主键 如id的get方法上面注上@Id 表明主键
根据实体类生成一个表结构
@Table注解
@Table(name="",catalog="",schema="")
与@Entity配合使用,只能标注在实体的class定义处,表示实体对应的数据表信息
两个属性 一个name 映射表的名称 一个schema 映射数据库的名称
@Embeddable注解
表示一个非Entity类可以嵌入到另一个Entity类中作为属性存在
不会映射到一张表 可以嵌入到其它实体类中作为属性存在
2 属性注解
@Id 一个实体如果有多个@Id注解 就要实现Serializeable接口
如果一个字符串类型作为主键就要设置字段长度 @Column(length=8)
@GeneratedValue 定义主键的生成策略
第四种的结合@TableGenerator 第一个参数是参考的表名,第二个是给这个表分配的空间
主键 手工赋值的生成方法
测试
不是getTransaction() 是beginTransaction()
@Column注解
@Embedded 注释表明这个属性是嵌入类 嵌入类也要加上@Embeddable注解
用StudentPK类包含两个主键 然后这个类要实现Serializable接口,最好加个序列化编号 ,有默认的无参数构造方法 ,覆盖equals和hashCode方法
在StudentPK中
在Student中
@Transient 注解 不想把某个属性映射到数据库当中
3 关系映射注释
单向1对1映射
Student(被控)和IdCard(主控)类
在Student类中
@OneToOne中的属性是级联关系 ALL表示全级联
@JoinColumn中的name 表示被控方的外键 unique表示是唯一的
在IdCard中
双向1对1映射mappedBy的值是主控方的外键值 这里主控方式Students
为什么设置mappedBy这个属性?
因为student和idcard这两个东西插入数据的时候,两个互为对方外键,后插入哪个都不行,必须要讲主动权交给一方,这里就是在被控方设置这个
单向一对多的映射
Student类和Classroom类
在多的那一方设置1的外键
在Student类中加入 fetch是抓取策略 @JoinColumn的name值是1的一方的主键,referencedColumnName是在数据库生成表的时候的外键的列名
双向一对多映射 一方持有另一方的集合
对于抓取策略 多方设置EAGER,一方设置LAZY(懒加载)
在Classroom类中加入
多对多单向外键
Teacher类和Student类
其中一个对方持有另一个多方的集合对象 需要创建中间表
@JoinTable中name是中间表的名称joinColumns是当前类主键的名称
inverseJoinColumns是集合类的主键名称
双向多对多
就是在单向多对多的基础上配置另一方
比如配置Teacher类 将主控权交给学生