hibernate二之注解式关联关系
一、关联关系使用注解
配置user表
<mapping resource="org/zttc/itat/model/User.hbm.xml"/>
<mapping class="org.zttc.itat.model.User"/>
就取代了原来的xml
类级别注解
@Entity 注解将一个类声明为实体Bean。实体必须有@Id。可以不加@Table也能生成表,name 为表名
@Table(name=“tbl_sky”)
name 表名,可省略
schema 模式
catalog 目录
@Entity 与@Table只写一个,会影响 hql,所以建议写全
数据库系统–>catalog -->schema -->表,视图,字段
但是各数据库厂家对它们的支持不同
MySQL的 schema 表示数据库名, catalog 不支持
Oracle 的 schema 表示用户ID,catalog 不支持
属性级别的注解
可以放在属性上或者get方法上
@Id 注解声明了该实体Bean的ID标识。
注意:如果多个属性定义了主键,则必须实现Serializable接口
作为主键的字符串必须限制长度,否则执行不报错,数据库没有表
@GeneratedValue
strategy = GenerationType.AUTO 指定主键生成策略 默认AUTO
GenerationType.IDENTITY:代理主键,适合于Mysql或ms sql server等支持自增的dbms,主键值不由hibernate维护。
GenerationType.SEQUENCE:代理主键,适合于oracle等支持序列的dbms,主键值不由hibernate维护,由序列产生。
GenerationType.TABLE:使用表来管理主键
常用的主键策略
手工赋值的策略
@Id
@GeneratedValue(generator = "sid")
@GenericGenerator(name = "sid", strategy = "assigned")
表格策略
@Id
@GeneratedValue(strategy=GenerationType.TABLE, generator="my_table")
@TableGenerator(
name = "my_table",
allocationSize = 1 // 增长值
)
数据库uuid策略
@Id
@GenericGenerator(name = "my-uuid", strategy = "uuid")
@GeneratedValue(generator = "my-uuid")
普通字段
@Column(name=“name_t”)
name=“columnName”; 列名
boolean unique() default false; 是否在该列上设置唯一约束
boolean nullable() default true; 列可空?
boolean insertable() default true; 该列是否作为生成 insert语句的一个列
boolean updatable() default true; 该列是否作为生成 update语句的一个列
String columnDefinition() default""; 默认值
String table() default “”; 定义对应的表(deault 是主表)
int length() default 255; 列长度
int precision() default 0;
decimalprecision decimal精度
int scale() default 0;
decimal scale decimal长度
columnDefinition
用法1:@Column(name = “Email”,columnDefinition=“varchar(128) not null”)
用法2:@Column(name = “Remark”,columnDefinition=“text”) 大文本格式
@Transient 持久化忽略该字段关联映射注解
二、多表级联
双向一对多是最常用的级联关系
@Entity
@Table(name="tb_student")
public class Student {
@Id
@GeneratedValue
private int id;
private String name;
private String no;
@ManyToOne(fetch= FetchType.LAZY)
@JoinColumn(name="cid")
private Classroom classroom;
}
@Entity
@Table(name="tb_classroom")
public class Classroom {
@Id
@GeneratedValue
private int id;
private String name;
@OneToMany(mappedBy="classroom")
private Set<Student> students;
}
@JoinColumn(name=“cid”) 当前实体表加入外键名为cid
mappedBy=“classroom” 不由当前属性维系关系,由集合里面的对象的classroom属性维系关系
一对一
一对一类似嵌套类,用的较少,大部分设置与一对多类似
@Entity
@Table(name="tb_person")
public class Person {
@Id
@GeneratedValue
private int id;
private String name;
@OneToOne(mappedBy = "person")
private IDCard idCard;
}
@Entity
@Table(name="tb_idCard")
public class IDCard {
@Id
@GeneratedValue
private int id;
private String no;
@OneToOne
@JoinColumn(name="pid")
private Person person;
}
多对多
双向多对多关系,角色与资源(学生与课程关系),重点就是中间表
@Entity
@Table(name = "tb_role")
public class Role {
@Id
@GeneratedValue
private int id;
private String name;
@ManyToMany(mappedBy="roles")
private Set<Resource > resources;
}
@Entity
@Table(name = "tb_resource")
public class Resource {
@Id
@GeneratedValue
private int id;
private String name;
@ManyToMany
@JoinTable(name="tb_role_resource",joinColumns={@JoinColumn(name="re_id")},
inverseJoinColumns={@JoinColumn(name="ro_id")})
private Set<Role> roles;
}
joinColumns 当前类的主键在中间表中的名字
inverseJoinColumns 对面表的 id 在当前中间表的名字
cascade 级联关系
CascadeType.PERSIST:级联新增(又称级联保存):对order对象保存时也对items里的对象也会保存。对应EntityManager的presist方法
CascadeType.MERGE:级联合并(级联更新):若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的merge方法
CascadeType.REMOVE:级联删除:对order对象删除也对items里的对象也会删除。对应EntityManager的remove方法
CascadeType.REFRESH:级联刷新:获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)方法有效。即会重新查询数据库里的最新数据 (用的比较少)
CascadeType.ALL:以上四种都是
fetch = FetchType.EAGER
LAZY 消极
EAGER 积极
@LazyCollection( value = LazyCollectionOption.EXTRA)
TRUE (集合具有延迟性,只有在访问的时候才加载),
EXTRA (集合具有延迟性,并且所有的操作都会尽量避免加载集合,对于一个巨大的集合特别有用,因为这样的集合中的元素没有必要全部加载)
FALSE(非延迟加载的关联)