Hibernate关联映射
*
ps : 关联映射
一 : Hibernate持久化类(PO)
- PO(Persistent Object) : pojo + 映射文件
(一) PO的编写规则
- 无参构造
- 所有属性要private ,对外提供public的
get/set方法
OID
: PO类中的一个标识属性,它与数据库中的主键对应- 属性类型要用包装类,不要用基本数据类型
- PO类不能使用
final
修饰符
(二) OID
- OID指的是与数据库中表的主键
对应
的属性。 - Hibernate框架是通过OID来区分不同的PO对象,如果在内存中有两个相同的OID对象,那么hibernate认为它们是同一个对象。
(三) PO类不可以使用final修饰?(hibernate中的get/load方法的区别)
get()/load()
方法它们都是根据id去查询对象。
1.获取对象
get()
: 直接得到了一个持久化类型对象,它就是立即查询操作load()
: 它得到的是持久化类型的代理类型对象(子类对象)。它采用了一种延迟策略来查询数据。
2.没有对象
get()
方法在查询时,如果不存在返回null
load()
方法在查询时,如果不存在,会报错ObjectNotFoundException
二 : Hibernate主键生成策略
(一) 主键类型
- 自然主键:具有业务含义字段作为主键(不推荐),比如:学号、身份证号。
- 代理主键:不具有业务含义字段作为主键,比如:mysql自增主键,oracle序列生成的主键、uuid唯一序列串。
(二) 常用策略类型
主键生成器 描述
identity
由底层数据库生成表识符。条件是数据库支持自动增长数据类型。比如:mysql
sequence
Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。比如oracle的序列。
uuid
Hibernate采用128bit位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符。此策略可以保证生成主键的唯一性,并且提供了最好的数据库插入性能和数据库平台的无关性
三 : PO的三种状态
- 瞬时态:不存在
OID
,session
没有管理,与数据库中的信息无关联。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。 - 持久态:存在
OID
,session
管理,在数据库中有可能有,也有可能没有。在事务未提交前一直是持久态,当它发生改变时,hibernate
是可以检测到的。 - 脱管态:存在
OID
,session
不管理,在数据库中有可能有,也有可能没有。对于脱管态对象,它发生改变时hibernet不能检测到。
Session session=SessionFactory.openSession();session.beginTransaction();
Customer c=new Customer();//瞬时态(无oid,与session无关联)
c.setName("tom");
c.setAddress("北京");
session.save(c);//建立了c与session关联关系,持久态(有oid)
session.getTransaction().commit();
session.close();//断开了与session的关联,托管态(有oid)
System.out.println(c.getId());
四 : 关联映射(注解)
注解 作用 属性名 属性值
@Entity
声明一个实体,后面不跟属性值
-
-
@Table
描述类与表对应
name
表名
catalog
数据库名,默认url中的库名,可以不写
@Id
声明一个主键,后面不跟属性值
-
-
@GenericGenerator
生成器(H)
name
生成器名称,如:"myuuid"
strategy
策略:uuid
@GeneratedValue
用它来声明一个主键生成策略
strategy
策略<br>GenerationType.IDENTITY
,<br>GenerationType.SEQUENCE
generator
生成器名称"myuuid"
@Column
定义列
name
列名
length
长度
nullable
是否可以为空
@Temporal
日期类型
value
TemporalType.DATA
:年月日<br>TemporalType.TIME
:时分秒<br>TemporalType.TIMESTAMP
:<br>年月日时分秒
(一) 一对一
- 原则有两种:
- 唯一外键对应 : 在任意一方添加外键来描述对应关系,但不能都加
- 主键对应 : 一方的主键作为另一方的主键
@Entity@Table(name = "t_user")
public class User {
@Id
@GenericGenerator(name = "myuuid", strategy = "uuid")
@GeneratedValue(generator = "myuuid")
private Integer id;
private String name;
@OneToOne(targetEntity = IDCard.class, mappedBy = "user")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private IDCard idCard;
getters&setters...
}
@Entity@Table(name = "t_idcard")
public class IDCard {
@Id
@GenericGenerator(name = "myuuid",strategy = "uuid")
@GeneratedValue(generator = "myuuid")
private Integer id;
private String cardNum;
@OneToOne(targetEntity = User.class)
@JoinColumn(name = "t_user_id")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private User user;
getters&setters...
}
- 写一个是单向关联
- 写两个,双向关联
- 一般都写两个,可以互相调用
(二) 一对多
- 客户与订单之间一对多关系(多对一)
- 建表原则:在多的一方(订单方)添加外键来描述关联关系
@Entity@Table(name = "t_customer")
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@OneToMany(targetEntity = Order.class,mappedBy = "customer")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private Set<Order> order;
getters&setters...
}
@Entity@Table(name = "t_order")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Double money;
private String receiverInfo;
@ManyToOne(targetEntity = Customer.class)
@JoinColumn(name = "t_customer_id")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private Customer customer;
getters&setters...
}
(三) 多对多
- 例如学生与老师
- 建表原则:通过一张中间表来描述其对应关系
@Entity@Table(name = "t_teacher")
public class Teacher {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToMany(targetEntity = Student.class,mappedBy = "teachers")
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private Set<Student> students;
getters&setters...
}
@Entity@Table(name = "t_student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private String name;
@ManyToMany(targetEntity = Teacher.class)
@JoinTable(
name = "s_t",
joinColumns = {@JoinColumn(name = "t_student_id")},
inverseJoinColumns = {@JoinColumn(name = "t_teacher_id")}
)
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
private Set<Teacher> teachers;
getters&setters...
}
以上是 Hibernate关联映射 的全部内容, 来源链接: utcz.com/z/511324.html