Hibernate

Posted qzcn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hibernate相关的知识,希望对你有一定的参考价值。

1、技术概述,描述这个技术是做什么?学习该技术的原因,技术的难点在哪里。控制在50-100字内。

Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Java对象与关系数据库之间建立某种映射,以实现直接存取Java对象!

2、技术详述,描述你是如何实现和使用该技术的,要求配合代码和流程图详细描述。可以再细分多个点,分开描述各个部分。

在DAO层操作XML,将数据封装到XML文件上,读写XML文件数据实现CRUD
在DAO层使用原生JDBC连接数据库,实现CRUD
嫌弃JDBC的ConnectionStatementResultSet等对象太繁琐,使用对原生JDBC的封装组件-->DbUtils组件

    publicstaticvoidmain(String[] args) {
        
        //创建对象
        User user = new User();
        user.setPassword("123");
        user.setCellphone("122222");
        user.setUsername("nihao");

        //获取加载配置管理类
        Configuration configuration = new Configuration();

        //不给参数就默认加载hibernate.cfg.xml文件,
        configuration.configure();

        //创建Session工厂对象
        SessionFactory factory = configuration.buildSessionFactory();

        //得到Session对象
        Session session = factory.openSession();

        //使用Hibernate操作数据库,都要开启事务,得到事务对象
        Transaction transaction = session.getTransaction();

        //开启事务
        transaction.begin();

        //把对象添加到数据库中
        session.save(user);

        //提交事务
        transaction.commit();

        //关闭Session
        session.close();
    }

3、技术使用中遇到的问题和解决过程。要求问题的描述和解决有一定的内容,不能草草概括。要让遇到相关问题的人看了你的博客之后能够解决该问题。

映射出错,基于外键的双向1-N关联。
注解@OneToMany
注解属性fetch - 配置加载方式(JPA)。取值有FetchType.EAGER - 及时加载,多对一默认是Fetch.EAGER
FetchType.LAZY - 延迟加载,一对多和多对多默认是Fetch.LAZY
cascade - 设置级联方式,取值(默认值none)有:
CascadeType.PERSIST - 保存
CascadeType.REMOVE - 删除
CascadeType.MERGE - 修改
CascadeType.REFRESH - 刷新
CascadeType.ALL - 全部
targetEntity :关联实体类名,一般不需要写。
mappedyBy: 关联实体的属性名,该属性指定关联实体中哪个属性可引用到当前实体。
@JoinColumn - 用于描述一个关联的字段,映射外键列。主要属性有:
name : 外键列的名称。
referencedColumnName: 关联的实体的主键一般是用来做外键的。但如果此时不想主键作为外键,则需要设置referencedColumnName属性。
unique:unique=true, 意味着1-1关联

在N的一端的数据表里增加一个外键列即可,因此应该在使用@ManyToOne注解的同时,使用@JoinColumn来映射外键列。
在1的一端则需要使用@OneToMany注解来修饰代表关联实体的属性。通常不应该允许1的一端控制关联关系,而应该由N的一端来控制关联关系,因此应该在@OneToMany注解使用指定mappedBy属性
// 定义该Address实体关联的Person实体
@ManyToOne(targetEntity=Person.class)
// 定义名为person_id外键列,该外键列引用person_inf表的person_id列。
@JoinColumn(name="person_id" , referencedColumnName="person_id"
, nullable=false)
private Person person;
// 定义该Person实体所有关联的Address实体
// 指定mappedBy属性表明该Person实体不控制关联关系
@OneToMany(targetEntity=Address.class
, mappedBy="person")
private Set

addresses = new HashSet<>();

4、进行总结。
该技术在多表关联中十分有用。
5、列出参考文献、参考博客(标题、作者、链接)。
Hibernate
概述:W3cschool


































以上是关于Hibernate的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate的HQL多表查询

使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)

Hibernate CriteriaQuery where - ManyToOne 字段

Hibernate + MySQL:如何为数据库和表设置编码 utf-8

hibernate在使用getCurrentSession时提示no session found for current thread

Java类型相互转换byte[]类型,blob类型