美文网首页
Hibernate学习笔记 - 第004天

Hibernate学习笔记 - 第004天

作者: 迷茫o | 来源:发表于2017-03-09 20:07 被阅读0次

    Session

    hibernate.cfg.xml
    session-factory
    Entity三种状态:

    • 瞬时态(transient)对象new出来 没放进session 数据库也没有 只在jvm里
    • 持久态(persistent)jvm里有这个对象 session 一级缓存管理了 数据库相关语句发出去了 只要提交就成功存在
    • 游离态(detached)session close了 数据有 jvm有 但没有被session 一级缓存管理

    为了避免内存泄漏我们可能需要手动清理一级缓存中的对象
    session.evict(obj) 把一个对象从session移除
    session.clear()
    以上两个方法会让对象从持久态变成游离态

    SessionFactory --> Session
    Session -- 映射容器(一级缓存)

    • get() / load()
    • save() / persist()
    • setter
    • delete()
    • update() / saveOrUpdate()
    • createQuery("")
    • createNativeQuery("")
      Query
      • setFirstResult()
      • setMaxResults()
      • getResultsList()

    设计实体类:
    1.不能是final
    2.必须保留无参构造器
    3.int - Integer double - Double 尽量用对象类型 不去用基本数据类型
    4.实现Serializable接口

    PO = POJO + 映射文件/注解
    映射实体类

    Hibernate注解

    @Entity
    指这个类映射有数据库表,那么你不使用这个类时,后台应该不会对其进行处理吧,只有当你从数据库读取数据时,由于你要读取的表映射有实体类(@entity注释的),那么后台应该会自动帮你实例化一个对象,然后将数据库中的数据填充到对象中
    @Table
    当实体类与其映射的数据库表名不同名时需要使用
    @Id
    指定这一属性对应数据库是主键
    @GeneratedValue
    主键生成策略
    @Column
    控制表列的属性
    @Transient
    表示该属性并非一个到数据库表的字段的映射
    @Embeddable
    一个实体类要在多个不同的实体类中进行使用,而本身又不需要独立生成一个数据库表时使用
    注释Java类的,嵌入式主键类
    @Embedded
    注释属性的,表示该属性的类是嵌入类
    @ManyToOne
    多对一
    @OneToMany
    一对多
    @OneToOne
    一对一
    @ManyToMany
    多对多
    @JoinColumn
    外键
    @JoinTable
    描述了多对多关系的数据表关系 生成一张只有双方主键作为外键的表来维持多对多关联关系
    @Inheritance
    用来指定对象继承关系持久化的方式
    @DiscriminatorColumn
    辨别器字段 用来区分子类
    @DiscriminatorValue
    子类辨别的名称
    @Formula

    多对多关联

    多对多关联 必须要额外的表来维持双方的关联 如: 学生可以选多个课程,如果只是双方2张表维持,那么学生每选一门课程 就要多填一行重复的记录

    实例

    例子1:用户、角色、特权
    用@JoinTable维持多对多关系

    用户

    @Entity
    @Table(name="tb_user")
    public class User {
        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Integer id;
        @Column(unique=true, nullable=false, length=20)
        private String username;
        @Column(name="userpass", nullable=false, length=20)
        private String password;
        @Column(length=50)
        private String email;
        @ManyToMany
        @JoinTable(name = "tb_user_role", 
                    joinColumns = @JoinColumn(name = "user_id"),
                    inverseJoinColumns = @JoinColumn(name = "role_id"))
        private List<Role> roles;
    }
    

    角色

    @Entity
    @Table(name = "tb_role")
    public class Role {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String name;
        @ManyToMany
        @JoinTable(name = "tb_role_priv", 
                    joinColumns = @JoinColumn(name = "role_id"),
                    inverseJoinColumns = @JoinColumn(name = "priv_id"))
        private List<Privilege> privs;
    }
    

    特权

    @Entity
    @Table(name = "tb_priv")
    public class Privilege {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String name;
        private String resource;
    }
    

    使用这种方式维持多对多 是额外创建一张只存放双方主键作为外键的表,这样如果再存一次相同的,就容易出问题,而且如果有两产生了多余的映射,就不好添加管理,如: 学生和成绩,课程和成绩

    例子2:学生、课程、成绩
    学生

    @Entity
    @Table(name = "tb_student")
    public class Student {
        @Id
        private String id;
        private String name;
        private String tel;
        @OneToMany(mappedBy = "student")
        private List<Score> scores;
    }
    

    课程

    @Entity
    @Table(name = "tb_course")
    public class Course {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        private String name;
        private Integer credit;
        @OneToMany(mappedBy = "course")
        private List<Score> scores;
    }
    

    成绩

    @Entity
    @Table(name = "tb_score")
    public class Score {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Integer id;
        @ManyToOne
        @JoinColumn(name = "student_id")
        private Student student;
        @ManyToOne
        @JoinColumn(name = "course_id")
        private Course course;
        private Integer mark;
    }
    

    推荐使用这种方式

    表间的继承

    例子3:商品、书、食物
    商品

    @Entity
    @Table(name = "tb_goods")
    @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
    @DiscriminatorColumn(name = "type")
    public class Goods {
        @Id
        protected Integer id;
        protected String name;
        protected Double price;
    }
    

    @Entity
    @DiscriminatorValue(value = "b")
    public class Book extends Goods {
        private String author;
    }
    

    食物

    @Entity
    @DiscriminatorValue(value = "f")
    public class Food extends Goods {
        private Date expireDate;
    }
    

    云服务

    LeanCloud
    七牛
    bmob

    相关文章

      网友评论

          本文标题:Hibernate学习笔记 - 第004天

          本文链接:https://www.haomeiwen.com/subject/fmjggttx.html