美文网首页
Hibernate连接数据库

Hibernate连接数据库

作者: x曦月y | 来源:发表于2016-08-24 20:55 被阅读66次

    开团先了解一番情况:

    Hibernate (开放源代码的对象关系映射框架)
    POJO(Plain Ordinary Java Object):简单的Java对象
    Session :会话控制
    Hibernate :主键策略

    与JDBC的优势:
    (1)连接方便:在类中映射关系即可,关闭会话而不关闭连接;
    (2)使用方便:nocation帮助解决数据库语句问题,需打印某列直接调用类中方法
    (3)心情愉悦。

    - 在Java中的连接: 配置的实体映射
     //configuration(组态) : 配置数据源。
     //configure( )中加载 cfg.xml 文件,传入该文件在项目中的相对位置
     //SessionFactory:负责初始化Hibernate ,它充当数据库存储源的代理,线程安全
     //Session  :负责执行被持久化的CRUD操作,非线程安全
    
    ①SessionFactory sf = new Configuration().configure().buildSessionFactory();
    //倘若在输入 ① ② 两句后还是出现空指针错误的话,就需要添加第三句,在中间:版本问题。
    ③StandardServiceRegistry  serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();
    ②Session session = sf.openSession();
    
    

    对应 的XML 文件内容:

    <!-- 实体映射 -->
    <?xml version="1.0" encoding="UTF-8"?>
    <hibernate-configuration>
        <session-factory>
        
            <property name="show_sql">true</property>
            
            <!-- 配置JDBC Driver --> / 调用java中对应的加载程序;
    
            <property name="connection.driver_class">com.mysql.jdbc.Driver</property>       
            <!-- 配置数据库连接URL -->
            <property name="connection.url">jdbc:mysql://localhost:3306/qingke?useSSL=false</property>
            
            <!-- 配置数据库连接用户名 -->
            <property name="connection.username">root</property>
        
            <!-- 配置数据库连接用户密码 -->
            <property name="connection.password">xyaychA</property>
            
            <!-- 配置hibernate使用的数据库方言 -->
            <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
            
            <!-- <mapping class="hibernate.Student"/> 
            <mapping resource="properties/apartment.hbm.xml"/>
            // 用XML文件来反应对象:
            <mapping resource="properties/college.hbm.xml"/>
            <mapping resource="properties/major.hbm.xml"/>
            <mapping resource="properties/course.hbm.xml"/>-->
            // 用类的映射方式关联对象:
            <mapping class="hibernate.sqlclass.Student"/>
            <mapping class="hibernate.sqlclass.StudentLogin"/>
            <mapping class="hibernate.sqlclass.StudentStatus"/>
            <mapping class="hibernate.sqlclass.Teacher"/>
            
        </session-factory>
    </hibernate-configuration>
    
    

    Hibernate :实体状态

    • 瞬时/临时状态(Transient) : 对象不存在与数据库 以及session缓存中
    • 持久化状态(Persistent):对象存在于数据库以及session缓存中
    • 离线状态(Detached):对象存在于数据库但不存在与session缓存中,即尚未被session管理。
    image.png

    Hibernate 事务管理

    • rollback ( ) 回滚。
    • commit ( ) 提交。
    • session.save(object)
    • Hibernate 增加、删除、更新

    关系映射:

    一:Hibernate有两种映射实体一对一关联关系的实现方式:共享主键方式和唯一外键方式。
        1.共享主键方式:所谓共享主键方式就是限制两个数据表的主键使用相同的值,通过主键形成一对一映射关系。
        2.唯一外键方式:所谓唯一外键方式就是一个表的外键和另一个表的唯一主键对应形成一对一映射关系,这种一对一的关系其实就是多对一关联关系的一种特殊情况.
    二:映射多对一单向实体关联关系:外键参照方式
    
    
    //student.hbm.xml文件 XML 方式连接
    <?xml version="1.0" encoding="UTF-8"?>
    
    <hibernate-mapping>
        <class name = "hibernate.sqlclass.Student" table="student">
            <id name = "id" column = " id">
                <generator class = "native" />
            </id>
            
            <property name = "lastname" column ="lastname"/>
            <property name = "firstname" column ="firstname"/>
            <property name = "password" column ="password"/>
            <property name = "email" column ="email"/>
            <property name = "height" column ="height"/>
            <property name = "weight" column ="weight"/>
            <property name = "gender" column ="gender"/>
        
        <!-- 一对一 (StudentLogin) -->  对应Student.class 文件中private StudentLogin login 属性
            <one-to-one name = "login" class = "hibernate.sqlclass.StudentLogin" cascade="all" />
            <one-to-one name="student" class="hibernate.sqlclass.Student"/>
            
        <!--  多对一 name="propertiesName" column="columnName" class="className" -->
            <many-to-one name = "status" column="student_status_id" class = "hibernate.sqlclass.StudentStatus"  />
            一对多方:
            <set name = "students" table ="teacher_has_student">
                <key column="teacher_id" />
                <many-to-many column="student_id" class="hibernate.Student" />
            </set>
            
        <!-- 多对多 主控方 --> 
            <set name = "teachers" table ="teacher_has_student">
                <key column ="student_id"/>
                <many-to-many column ="teacher_ids" class="hibernate.Teacher"/>
            </set>
        <!-- 被控方 -->
            <set name = "students" table ="teacher_has_student">
                <key column="teacher_id" />
                <many-to-many column="student_id" class="hibernate.Student" />
            </set>
            
        </class>
    </hibernate-mapping>
    
    通过类映射:@Entity    @Table(name="表名")  @Id 该类对应表的主键   @Column 对应的属性;
    
    一、多对多(主控方):
    @ManyToMany
    @JoinTable(name="teacher_has_student",  //中间表为:middle_table_name
            joinColumns = @JoinColumn (name="student_id"), //主控方在中间表中的外键名
            inverseJoinColumns = @JoinColumn (name="teacher_id")) //被控方在中间表中的外键名
    private Set<Teacher> teachers;
    (被控方): @ManyToMany ( mappingBy = "propertyName");
    
    二、一对多关系(双向):
    一对多:
    @OneToMany, 
    @JoinColumn(name = "foreginKeyName ")
    多对一:
    @ManyToOne(),
    @JoinColumn ( name = "foreginKeyName " )
    
    三、一对一(双向):
    @OneToOne
    @PrimaryKeyJoinColumn(name="id") //共享主键
    private StudentLogin login;
    
    @OneToOne(mappedBy= "login")
    private Student student;//唯一外键 属性名。即:Student中private StudentLogin login; 
    

    其他

    • lazy Load(延迟加载):为了减少由于大量关联信息引起的查询性能负担,需要时才加载。
    • 级联设置(cascade):
      1.all - 所有操作都执行级联删除.
      2.none - 所有都不.
      3.update.
      4.delete.
    • 控制设置(inverse)
    1. 是否将维护关系的权利交给对方
    2. 默认值为false,可选true
    3. 一对多关系中,通常将 “一” 为true,即由 多 来维护关系
    4. Java Annotation中由mappedBy

    相关文章

      网友评论

          本文标题:Hibernate连接数据库

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