ORM-02-Hibernate 对象关系映射(ORM)框架

拓展阅读

The jdbc pool for java.(java 手写 jdbc 数据库连接池实现)

The simple mybatis.(手写简易版 mybatis)

Hibernate

Hibernate ORM 允许开发者更轻松地编写那些数据在应用程序进程结束后仍然存在的应用程序。

作为一个对象关系映射(ORM)框架,Hibernate 关注的是与关系数据库(通过 JDBC)相关的数据持久化。

hibernate

Hello world

  • Event.java
/**
 * Created by houbinbin on 16/5/18.
 */
public class Event {
    private Long id;
    private String title;
    private Date date;

    //
}
  • HibernateUtil.java
public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private HibernateUtil() {}

    public static SessionFactory getSessionFactory() {
        if(sessionFactory == null) {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        }

        return sessionFactory;
    }
}
  • EventService.java
public class HibernateUtil {
    private static SessionFactory sessionFactory;
    private HibernateUtil() {}

    public static SessionFactory getSessionFactory() {
        if(sessionFactory == null) {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        }

        return sessionFactory;
    }
}
  • EventTest.java is today’s lead.
public class EventTest extends TestCase {
    private EventService eventService;

    @Before
    public void setUp() {
        eventService = new EventService();
    }

    @Test
    public void testCreate() {
        eventService.createAndStoreEvent("create Event", new Date());
    }

    @Test
    public void testQuery() {
        List<Event> events = eventService.listEvents();
        for (Event event : events) {
            System.out.println(event);
        }
    }

    @After
    public void tearDown() {
        HibernateUtil.getSessionFactory().close();
    }
}

run testCreate()

INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
Hibernate: insert into EVENT (EVENT_DATE, title) values (?, ?)

run testQuery()

Hibernate: select event0_.EVENT_ID as EVENT_ID1_0_, event0_.EVENT_DATE as EVENT_DA2_0_, event0_.title as title3_0_ from EVENT event0_
五月 20, 2016 12:05:45 上午 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:mysql://localhost/hibernate]
Event{id=1, title='My Event', date=2016-05-19 21:48:56.0}
Event{id=2, title='Test Event', date=2016-05-19 22:58:43.0}
Event{id=3, title='create Event', date=2016-05-19 23:32:49.0}
Event{id=4, title='create Event', date=2016-05-20 00:04:40.0}

Process finished with exit code 0

Annotation

Now, let’s use annotation way to achieve code above.

  • Student.java
/**
 * Created by houbinbin on 16/5/20.
 */
@Entity
public class Student {
    private Long id;
    private String name;
    private int score;

    //getter and setter...

    //default constructor and with members' constructor

    //toString()

}

  • StudentService.java
public class StudentService extends BaseService<Student> {
    public String getEntityName() {
        return "Student";
    }
}
  • BaseService.java
/**
 * Created by houbinbin on 16/5/20.
 */
public abstract class BaseService<T> {
    /**
     * get current entity's name;
     * @return
     */
    public abstract String getEntityName();

    /**
     * save the entity.
     * @param entity
     * @return
     */
    public Serializable save(T entity) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Serializable result = session.save(entity);
        session.getTransaction().commit();

        return result;
    }

    /**
     * list all data of entity;
     * @return
     */
    public List<T> list() {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        List<T> result = session.createQuery("FROM " + getEntityName()).list();
        session.getTransaction().commit();
        return result;
    }

    /**
     * show the list
     * - you need write the correct toString() of entity;
     */
    public void show() {
        List<T> result = list();

        for(T entity : result) {
            System.out.println(entity);
        }
    }
}
  • StudentTest.java
public class StudentTest extends TestCase {
    private StudentService studentService;

    @Before
    public void setUp() {
        studentService = new StudentService();
    }

    @Test
    public void testCreate() {
        Student student = new Student("xiaoming", 70);

        studentService.save(student);
    }

    @Test
    public void testShow() {
        studentService.show();
    }

    @After
    public void tearDown() {
        HibernateUtil.getSessionFactory().close();
    }
}

Mapping

  • @Table

The identifier uniquely identifies each row in that table. By default the name of the table is assumed to be the
same as the name of the entity. To explicitly give the name of the table or to specify other information about the table,
we would use the javax.persistence.Table annotation.

@Entity
@Table(name="t_simple")
public class Simple {
    private int id;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

the created table named t_simple.

  • @Basic

Strictly speaking, a basic type is denoted with the javax.persistence.Basic annotation.
Generally speaking the @Basic annotation can be ignored. Both of the following examples are ultimately the same.

so, the code above is the same as…

@Entity
@Table(name="t_simple")
public class Simple {
    private int id;

    @Id
    @GeneratedValue
    @Basic
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
  • @Column

For basic type attributes, the implicit naming rule is that the column name is the same as the attribute name.
If that implicit naming rule does not meet your requirements, you can explicitly tell Hibernate (and other providers) the column name to use.

@Entity
public class Simple {
    private int id;

    @Id
    @GeneratedValue
    @Column(name="t_id")
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

the created table column will be “t_id”.

  • @Enumerated

ORDINAL - stored according to the enum value’s ordinal position within the enum class, as indicated by java.lang.Enum#ordinal

STRING - stored according to the enum value’s name, as indicated by java.lang.Enum#name

@Entity
public class Simple {
    private int id;
    private Gender gender;

    @Id
    @GeneratedValue
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Enumerated(STRING)
    public Gender getGender() {
        return gender;
    }

    public void setGender(Gender gender) {
        this.gender = gender;
    }

    public static enum Gender {
        MALE, FEMALE
    }
}

result is MALE;

change into

@Enumerated
public Gender getGender() {
    return gender;
}

result is 0;

Spring

When hibernate meets spring, things will be interesting…What I want to say, is hibernate’s model define.

  • hbm.xml
<bean id="mySessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="mappingResources">
        <list>
            <value>user.hbm.xml</value>
        </list>
    </property>
</bean>
  • class
<property name="annotatedClasses">
    <list>
        <value>com.ryo.model.User</value>
    </list>
</property>
  • auto scan
<property name="packagesToScan">
    <list>
        <value>com.ryo.model.*</value>
    </list>
</property>

packagesToScan specify packages to search for autodetection of your entity classes in the classpath.

So, the * in com.ryo.model.*is stand for package name. If your model classes are like this…

/com/ryo/model/
    - User.java

You need write com.ryo.*

Or, you can write like this…

<list>
    <value>com.ryo.model</value>
</list>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯省赛无忧 编程14 肖恩的投球游戏加强版

#include <stdio.h> #define MAX_N 1003 int a[MAX_N][MAX_N], d[MAX_N][MAX_N]; // 差分数组的初始化 void init_diff(int n, int m) {for (int i 1; i < n; i) {for (int j 1; j < m; j) {d[i][j] a[i][j] - a[i-1][j] - a[i][j-1] a[i-1][j-1];}} } // 对差…

【王道数据结构】【chapter2线性表】【P44t17~t20】【统考真题】

目录 2009年统考 2012年统考 2015年统考 2019年统考 2009年统考 #include <iostream>typedef struct node{int data;node* next; }node,*list;list Init() {list head(list) malloc(sizeof (node));head->next nullptr;head->data-1;return head; }list Buyne…

QA-GNN: 使用语言模型和知识图谱的推理问答

Abstract 使用预训练语言模型&#xff08;LMs&#xff09;和知识图谱&#xff08;KGs&#xff09;的知识回答问题的问题涉及两个挑战&#xff1a;在给定的问答上下文&#xff08;问题和答案选择&#xff09;中&#xff0c;方法需要&#xff08;i&#xff09;从大型知识图谱中识…

C++:auto 关键字 范围for

目录 auto 关键字&#xff1a; 起源&#xff1a; auto的使用细则&#xff1a; auto不能推导的场景&#xff1a; 范围for&#xff1a; 范围for的使用条件&#xff1a; C的空指针&#xff1a; 注意&#xff1a; auto 关键字&#xff1a; 起源&#xff1a; 随着程序越…

蜡烛图采用PictureBox控件绘制是实现量化的第一步

股票软件中的蜡烛图是非常重要的一个东西&#xff0c;这里用VB6.0自带的Picture1控件的Line方法就可以实现绘制。 关于PictureBox 中的line 用法 msdn 上的说明为如下所示 object.Line [Step] (x1, y1) [Step] - (x2, y2), [color], [B][F] 然…

【Axure教程0基础入门】02高保真基础

02高保真基础 1.高保真原型的要素 &#xff08;1&#xff09;静态高保真原型图 尺寸&#xff1a;严格按照截图比例&#xff0c;参考线 色彩&#xff1a;使用吸取颜色&#xff0c;注意渐变色 贴图&#xff1a;矢量图/位图&#xff0c;截取&#xff0c;覆盖等 &#xff08;…

【Java Kubernates】Java调用kubernates提交Yaml到SparkOperator

背景 目前查询框架使用的是trino&#xff0c;但是trino也有其局限性&#xff0c;需要准备一个备用的查询框架。考虑使用spark&#xff0c;spark operator也已经部署到k8s&#xff0c;现在需要定向提交spark sql到k8s的sparkoperator上&#xff0c;使用k8s资源执行sql。 对比 …

【linux】查看进程和子进程

在Linux系统中&#xff0c;可以使用多个命令来查看进程及其子进程。以下是一些常用的方法&#xff1a; 1. ps 命令 ps 命令用于显示当前进程的状态。可以结合不同的选项来查看进程及其子进程。 查看进程树&#xff1a; ps -auxf - -a 显示所有进程。 - -u 显示进程的用户/所…

2024年最适合开Palworld的游戏服务器

如果要开Palworld服务器&#xff0c;当然要选大内存的服务器 在雨云&#xff0c;你不仅可以 链接&#xff1a;雨云 - 新一代云服务提供商欢迎来到以用户体验为优先的雨云&#xff0c;我们提供稳定高速的国际虚拟主机&#xff0c;云服务器产品&#xff0c;强大的功能&#xff…

MySQL中使用percona-xtrabackup工具 三种备份及恢复 (超详细教程)

CSDN 成就一亿技术人&#xff01; 今天讲讲再MySQL中使用percona-xtrabackup这个开源工具来实现在线备份。 CSDN 成就一亿技术人&#xff01; 目录 介绍percona-xtrabackup 安装Percona 完整备份 备份流程 恢复流程 1.模拟文件损坏 2.滚回日志 3.恢复数据目录 4.授权…

复现五 LMDeploy 的量化和部署

0基础知识 一步一步跟着教程复现第五&#xff1a;LMDeploy 的量化和部署 复现一&#xff1a; 轻松玩转书生浦语大模型internlm-demo 配置验证过程_ssh -cng -l 7860:127.0.0.1:6006 rootssh.intern-ai-CSDN博客文章浏览阅读827次&#xff0c;点赞17次&#xff0c;收藏24次。…

BTC的数据结构Merkle Tree和Hash pointer

比特币是一种基于区块链技术的加密数字货币&#xff0c;其底层数据结构被设计为分布式&#xff0c;去中心化的。它的核心数据结构是一个链式的区块&#xff0c;每个区块都包含了多笔交易记录和一个散列值。 比特币的底层数据结构使用了两个关键概念&#xff1a;hash pointer和…

01 Redis的特性+下载安装启动+Redis自动启动+客户端连接

1.1 NoSQL NoSQL&#xff08;“non-relational”&#xff0c; “Not Only SQL”&#xff09;&#xff0c;泛指非关系型的数据库。 键值存储数据库 &#xff1a; 就像 Map 一样的 key-value 对。如Redis文档数据库 &#xff1a; NoSQL 与关系型数据的结合&#xff0c;最像关系…

AP3464 车充 适配器IC 4-30V 2.4A 同步降压驱动器

AP3464 是一款支持宽电压输入的同步降压电源管理芯片&#xff0c;输入电压 4-30V 范围内可实现2.4A 的连续电流输出。通过调节 FB 端口的分压电阻&#xff0c;设定输出 1.8V 到 28V 的稳定电压。AP3464 具有优秀的恒压/恒流(CC/CV)特性。AP3464 采用电流模式的环路控制原理&…

Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入)

Spring5深入浅出篇:Spring中ioc(控制反转)与DI(依赖注入) 反转(转移)控制(IOC Inverse of Control) 控制&#xff1a;对于成员变量赋值的控制权 反转控制&#xff1a;把对于成员变量赋值的控制权&#xff0c;从代码中反转(转移)到Spring⼯⼚和配置⽂件中完成好处&#xff1a;…

基于YOLOv8的摄像头吸烟行为检测系统(Python源码+Pyqt6界面+数据集)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了摄像头下吸烟行为检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Pytorch的源码、训练数据集以及PyQt6的UI界面。在界面中可以选择各种图片、视频进行检测识别&#xff0c;可进行置信度、Iou阈值设定…

Pandas.Series.mode() 众数 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本&#xff1a; 本文基于 pandas2.2.0 编写。 关于本文内容更新&#xff1a; 随着pandas的stable版本更迭&#xff0c;本文持续更新&#xff0c;不断完善补充。 传送门&#xff1a; Pandas API参考目录 传送门&#xff1a; Pandas 版本更新及新特性 传送门&…

LeetCode---122双周赛

题目列表 3010. 将数组分成最小总代价的子数组 I 3011. 判断一个数组是否可以变为有序 3012. 通过操作使数组长度最小 3013. 将数组分成最小总代价的子数组 II 一、将数组分成最小总代价的子数组I 这道题纯纯阅读理解题&#xff0c;关键在于理解题意。注意&#xff1a;第一…

Go语言基础之单元测试

1.go test工具 Go语言中的测试依赖go test命令。编写测试代码和编写普通的Go代码过程是类似的&#xff0c;并不需要学习新的语法、规则或工具。 go test命令是一个按照一定约定和组织的测试代码的驱动程序。在包目录内&#xff0c;所有以_test.go为后缀名的源代码文件都是go …

【时间安排】

最近刚刚回到家&#xff0c;到家就是会有各种事情干扰&#xff0c;心里变乱人变懒的&#xff0c;而要做的事情也要继续&#xff0c;写论文&#xff0c;改简历&#xff0c;学习新技能。。 明天后天两天写论文改简历 周一&#xff08;早上去城市书房&#xff0c;可能吵一点戴个耳…