Hibernate关联映射

编程

* 

ps : 关联映射

一 : Hibernate持久化类(PO)

  • PO(Persistent Object) : pojo + 映射文件

(一) PO的编写规则

  1. 无参构造
  2. 所有属性要private ,对外提供public的get/set方法
  3. OID : PO类中的一个标识属性,它与数据库中的主键对应
  4. 属性类型要用包装类,不要用基本数据类型
  5. 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的三种状态

  1. 瞬时态:不存在OIDsession没有管理,与数据库中的信息无关联。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。
  2. 持久态:存在OID,session管理,在数据库中有可能有,也有可能没有。在事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。
  3. 脱管态:存在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>年月日时分秒

(一) 一对一

  • 原则有两种:

    1. 唯一外键对应 : 在任意一方添加外键来描述对应关系,但不能都加
    2. 主键对应 : 一方的主键作为另一方的主键

@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

回到顶部