zoukankan      html  css  js  c++  java
  • 三。Hibernate 注解形式

    Hibernate支持JPA注解的jar包

    JPA全称: Java Persistence API

    JPA和Hibernate之间的关系,可以简单的理解为JPA是标准接口,Hibernate是实现。

    使用注解的形式进行配置可以代替实体类的 *.hbm.xml 的映射配置文件,但仍需在 hibernate.cfg.xml 配置文件中进行实体类的注册

    实例:class班级、student学生、project学科。

     配置一对多与多对一、多对多。

    学生实体类 Student.java

    package com.pojo;
    
    import java.util.Date;
    import java.util.Set;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.JoinTable;
    import javax.persistence.ManyToMany;
    import javax.persistence.ManyToOne;
    import javax.persistence.Table;
    
    import org.hibernate.annotations.GenericGenerator;
    @Entity @Table(name
    ="student_info",schema="C##java06") public class Student { @Id//表明这个字段就是主键 @GeneratedValue(generator="incre") @GenericGenerator(name="incre",strategy="increment") @Column(name="student_id") int studentId; @Column(name="student_name") String studentName; @Column(name="student_Sex") String studentSex;
    @Column(name
    ="student_age") int studentAge;
    // @Column(name="class_Id") // int classId;
    @ManyToOne(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER) @JoinColumn(name="class_id") ClassInfo classinfo;
    @Column(name
    ="birthday") Date birthday;
    @ManyToMany(fetch
    =FetchType.EAGER) @JoinTable(name="stu_project") Set<ProjectInfo> projects; public int getStudentId() { return studentId; } public void setStudentId(int studentId) { this.studentId = studentId; } public String getStudentName() { return studentName; } public void setStudentName(String studentName) { this.studentName = studentName; } public String getStudentSex() { return studentSex; } public void setStudentSex(String studentSex) { this.studentSex = studentSex; } public int getStudentAge() { return studentAge; } public void setStudentAge(int studentAge) { this.studentAge = studentAge; } // public int getClassId() { // return classId; // } // public void setClassId(int classId) { // this.classId = classId; // } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public ClassInfo getClassinfo() { return classinfo; } public void setClassinfo(ClassInfo classinfo) { this.classinfo = classinfo; } public Set<ProjectInfo> getProjects() { return projects; } public void setProjects(Set<ProjectInfo> projects) { this.projects = projects; } public Student() { } public Student(int studentId, String studentName, String studentSex, int studentAge, ClassInfo classinfo, Date birthday) { this.studentId = studentId; this.studentName = studentName; this.studentSex = studentSex; this.studentAge = studentAge; // this.classId = classId; this.classinfo = classinfo; this.birthday = birthday; } }

    班级实体类ClassInfo.java

    package com.pojo;
    
    import java.util.Date;
    import java.util.Set;
    
    import javax.persistence.CascadeType;
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.FetchType;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.OneToMany;
    import javax.persistence.Table;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    @Table(name="class_info",schema="JAVA")
    public class ClassInfo {
        @Id//表明这个字段就是主键
        @GeneratedValue(generator="incre")
        @GenericGenerator(name="incre",strategy="increment")
        @Column(name="class_id")
    //    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="CUST_SEQ")//使用序列的方式维护主键
        int classId;
    
        @Column(name="class_name")
        String className;
    
        @Column(name="create_time")
        Date createTime;
    
        @Column(name="status")
        String status;
    
        @OneToMany(mappedBy="classinfo",cascade=CascadeType.ALL ,fetch=FetchType.EAGER)
        Set<Student> stus;
        
        public ClassInfo() {
        }
        
        public ClassInfo(int classId, String className, Date createTime, String status) {
            this.classId = classId;
            this.className = className;
            this.createTime = createTime;
            this.status = status;
        }
    
        public int getClassId() {
            return classId;
        }
        public void setClassId(int classId) {
            this.classId = classId;
        }
        public String getClassName() {
            return className;
        }
        public void setClassName(String className) {
            this.className = className;
        }
        public Date getCreateTime() {
            return createTime;
        }
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
        public String getStatus() {
            return status;
        }
        public void setStatus(String status) {
            this.status = status;
        }
        
        public Set<Student> getStus() {
            return stus;
        }
    
        public void setStus(Set<Student> stus) {
            this.stus = stus;
        }
        
    }

    科目实体类ProjectInfo.java

    package com.pojo;
    
    import java.util.Set;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import javax.persistence.Table;
    
    import org.hibernate.annotations.GenericGenerator;
    
    @Entity
    @Table(name="project_info",schema="JAVA")
    public class ProjectInfo {
        @Id//表明这个字段就是主键
        @GeneratedValue(generator="incre")
        @GenericGenerator(name="incre",strategy="increment")
        @Column(name="project_id")
        int projectid;
    
        @Column(name="project_name")
        String projectname;
    
        @ManyToMany(mappedBy="projects")
        Set<Student> stus;
        
        public int getProjectid() {
            return projectid;
        }
        public void setProjectid(int projectid) {
            this.projectid = projectid;
        }
        public String getProjectname() {
            return projectname;
        }
        public void setProjectname(String projectname) {
            this.projectname = projectname;
        }
        
        
    }

     配置文件hibernate.cfg.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    <hibernate-configuration>
        <session-factory>
            <!--数据库方言 -->
            <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>
            <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
            <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
            <property name="connection.username">C##java06</property>
            <property name="connection.password">java123</property>
            <property name="show_sql">true</property>
            <property name="format_sql">true</property>
            <property name="hibernate.hbm2ddl.auto">update</property>
    <!--         所有的实体类映射文件要在此处全部注册 -->
    <!--         <mapping resource="com/pojo/Student.hbm.xml"/> -->
    <!--         用注解的方式写pojo -->
            <mapping class="com.pojo.ClassInfo"/>
            <mapping class="com.pojo.Student"/>
            <mapping class="com.pojo.ProjectInfo"/>
        </session-factory>
    </hibernate-configuration>

    测试代码

    TestRelotion.java
    package com.dao;
    
    import java.util.Date;
    import java.util.HashSet;
    import java.util.List;
    
    import com.pojo.ClassInfo;
    import com.pojo.ProjectInfo;
    import com.pojo.Student;
    
    public class TestRelotion {
        public static void main(String[] args) {
            IStudentDAO stuDAO = new StudentDAO();
    //        List<Student> list = stuDAO.queryObjectByHql("from Student");
    //        for (Student stu : list) {
    //            System.out.println(stu.getStudentName()+",班级是:"+stu.getClassinfo().getClassName()+"开班时间:"+stu.getClassinfo().getCreateTime());
    //        }
    //        
            IClassInfoDAO cdao = new ClassInfoDAO();
    //        List<ClassInfo> cs =  cdao.queryObjectBySql("select * from Class_Info a where a.class_Id=1",ClassInfo.class);
    //        ClassInfo c=  cs.get(0);
    //        System.out.println(c.getClassName());
    //        for (Student stu : c.getStus()) {
    //            System.out.println(stu.getStudentName()+"	"+stu.getBirthday());
    //        }
    
            //新增学员
    //        ClassInfo c = new ClassInfo(2, null, null, null);
    //        Student stu = new Student(0,"测试新增","1",20,c,new Date());
    //        stuDAO.saveObject(stu);
    
            //删除学员
    //        Student stu = new Student();
    //        stu.setStudentId(13);
    //        stuDAO.delObject(stu);
    
            //修改学员
    //        List<Student> stus = stuDAO.queryObjectByHql("from Student a where a.studentId=1");
    //        Student stu = stus.get(0);
    //        stu.setStudentName("谢娜");
    //        stu.setClassinfo(new ClassInfo(1,null,null,null));
    //        stuDAO.updateObject(stu);
    
            //删除班级
    //        ClassInfo c = new ClassInfo(3, null, null, null);
    //        cdao.delObject(c);
            
            //给学员选课
            //给学员新增选课
            //给学员删除选课
            //查询学员选了哪些课
            //查询课程被哪些学员选中
            List<Student> stus = stuDAO.queryObjectByHql("from Student a where a.studentId=1");
            Student stu = stus.get(0);
            //stu.setProjects(projects);
    
            IProjectInfoDAO projectDAO = new ProjectInfoDAO();
    //        List<ProjectInfo> plist = projectDAO.queryObjectByHql("from ProjectInfo");
    //        stu.setProjects(new HashSet(plist));
    //        stuDAO.updateObject(stu);
    
    //        for (ProjectInfo p : stu.getProjects()) {
    //            System.out.println(p.getProjectname());
    //        }
        }
    }

    附:

      常用JPA注解

    常用:
    @Entity: @Table(name="表名",schema="数据库名"):表明这是一个实体类。一般用于jpa这两个注解一般一块使用,但是如果表名和实体类名相同的话, @Table可以省略
    
    @Id:表示该属性为主键。
    
    @Column:如果字段名与列名相同,则可以省略。
    
    @GeneratedValue:JPA通用策略生成器
        (strategy = GenerationType.SEQUENCE,generator = “repair_seq”):表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。
        TABLE:使用一个特定的数据库表格来保存主键。 
        SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 
        IDENTITY:主键由数据库自动生成(主要是自动增长型) 
        AUTO:主键由程序控制。
    
    @GenericGenerator:hibernate主键策略生成器 
        @GenericGenerator注解配合 @GeneratedValue一起使用, @GeneratedValue注解中的"generator"属性要与 @GenericGenerator注解中name属性一致,strategy属性表示hibernate的主键生成策略 
        
    @OneToOne、 @OneToMany、 @ManyToOne:对应hibernate配置文件中的一对一,一对多,多对一,有主从关系。
        eg: @OneToMany(mappedBy="classinfo",cascade=CascadeType.ALL ,fetch=FetchType.EAGER)
            fetch取值:
                FetchType.EAGER  表示主类被加载时加载,
                FetchType.LAZY 后者表示被访问时才会加载。
            cascade取值:
                CascadeType.PERSIST(级联新建),
                CascadeType.REMOVE(级联删除),
                CascadeType.REFRESH(级联刷新),
                CascadeType.MERGE(级联更新),
                CascadeType.ALL(选择全部)。
    
    @JoinColumn(name=”loginId”):一对一:本表中指向另一个表的外键。一对多:另一个表指向本表的外键。
    
    
    其他:
    @SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。
    
    @Transient:表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。
        如果一个属性并非数据库表的字段映射,就务必将其标示为 @Transient,否则,ORM框架默认其注解为 @Basic。
        @Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式
    
    @JsonIgnore:作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。
    
    @MappedSuperClass:用在确定是父类的entity上。父类的属性子类可以继承。
    
    @NoRepositoryBean:一般用作父类的repository,有这个注解,spring不会去实例化该repository。

      

  • 相关阅读:
    数据库事务隔离级别-- 脏读、幻读、不可重复读
    【洛谷7518】[省选联考 2021 A/B 卷] 宝石(树上倍增+并查集)
    【CF666D】Chain Reaction(暴搜+细节讨论)
    【洛谷5064】[Ynoi2014] 等这场战争结束之后(操作树+值域分块)
    【洛谷7437】既见君子(状压+矩阵树定理)
    【洛谷5046】[Ynoi2019 模拟赛] Yuno loves sqrt technology I(分块)
    【LOJ2462】「2018 集训队互测 Day 1」完美的集合(树上连通块问题+扩展卢卡斯)
    【洛谷4339】[ZJOI2018] 迷宫(神仙题)
    【CF639E】Bear and Paradox(贪心+二分)
    【洛谷5444】[APIO2019] 奇怪装置(数论)
  • 原文地址:https://www.cnblogs.com/wlxslsb/p/10790590.html
Copyright © 2011-2022 走看看