JPA Hibernate 快速入门

选中文字可对指定文章内容进行评论啦,绿色背景文字可以点击查看评论额。

为了学习JPA的实体状态的转化,我们先搭建一个通过JPA Hibernate存储实体到数据库的Demo,后续的学习都在此demo基础上展开。

添加Hibernate依赖 

<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-entitymanager</artifactId>
  <version>5.4.4.Final</version>
</dependency>

添加JDBC驱动

<dependency>
  <groupId>com.h2database</groupId>
  <artifactId>h2</artifactId>
  <version>1.4.199</version>
</dependency>

META-INF/persistence.xml添加JPA和数据库配置文件

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="Hibernate-JPA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            <property name="hibernate.connection.driver_class" value="org.h2.Driver"/>
            <!-- H2 is running in pure in Memory db mode, data will be lost as soon as connection is closed -->
            <property name="hibernate.connection.url" value="jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE"/>
            <property name="hibernate.connection.username" value="sa"/>
            <property name="hibernate.connection.pool_size" value="5"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="update"/>
        </properties>
    </persistence-unit>
</persistence>

各位请注意:这里有一个标签<persistence-unit>

这个标签的作用我们以后结合JPA架构进行学习和理解

创建实体管理器工厂类

public class JPAUtil {

    public static EntityManagerFactory getEntityManagerFactory() {

        EntityManagerFactory entityManagerFactory = Persistence
                .createEntityManagerFactory("Hibernate-JPA");
        return entityManagerFactory;
    }
}

映射实体类

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "teachers")
public class Teacher {
    @Id
    @GeneratedValue
    private Long id;
    private String email;
    //Must have empty constructor
    public Teacher() {
    }

    public Teacher(String email) {
        this.email = email;
    }
    //Getter/setter, toString() etc

    public Long getId() {
        return id;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", email='" + email + '\'' +
                '}';
    }
}

使用实体管理器类CRUD实体

import com.jpa.demo.model.Teacher;
import com.jpa.demo.utils.JPAUtil;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;

public class TeacherDao {
    private EntityManagerFactory entityManagerFactory = JPAUtil.getEntityManagerFactory();
    public Long save(Teacher teacher) {
        EntityManager entityManager = null;
        Long id = null;
        try {
            entityManager = this.entityManagerFactory.createEntityManager();
            EntityTransaction tx = entityManager.getTransaction();
            tx.begin();
            entityManager.persist(teacher);
            id = teacher.getId();
            tx.commit();
        } finally {
            entityManager.close();
        }
        return id;
    }

    public Teacher find(Long id) {
        EntityManager entityManager = null;
        Teacher teacher = null;
        try {
            entityManager = this.entityManagerFactory.createEntityManager();
            EntityTransaction tx = entityManager.getTransaction();
            tx.begin();
            teacher =  entityManager.find(Teacher.class,id);
            teacher.setEmail("updateEmail@devnote.pro");
            tx.commit();
        } finally {
            entityManager.close();
        }
        return teacher;
    }

}

测试

public class App 
{
    public static void main( String[] args )
    {
        try {
            Teacher teacher = new Teacher("email@dot.com");
            TeacherDao teacherDao = new TeacherDao();
            Long id = teacherDao.save(teacher);
            System.out.println("Student created with id: " + id);
            teacher = teacherDao.find(id);
            System.out.println("\n\n" + teacher);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

版权声明:著作权归作者所有。

相关推荐

[译]Java 9:一步步迁移项目到Jigsaw(模块化)

Java 9出来了。 我们来试试一个简单的Spring项目。 为了使练习更具挑战性,我们还要尝试使用新的模块系统。 该项目只是一个使用Spring,JDBC和Shedlock的简单示例。1、阅读所有可用的文档和规格说明。 嗯,听起来很无聊。 跳过第一步。2、下载JDK并尝试运行该项目。 我们很幸运,我们所有的依赖只使用公共Jav

SpringBoot入门示例

创建Maven POM文件在pom.xml添加内容如下:<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="ht

代码编辑器monaco-editor用法入门

monaco editor是微软开源的一款web版代码编辑器。它支持智能提示,代码高亮,代码格式化。这里简单介绍下它的用法。1、下载安装monaco-editornpm install monaco-editor下载后,安装目录为node_modules/monaco-editor/。2、添加loader.js脚本到页面在集成monaco-editor的页面,添加&l

初识parcel

webpack是一个很好的web应用打包工具,但是使用webpack需要很多繁琐的配置。parcel则提供了一个零配置的方案,大大简化了使用web应用的工具的难度。Parcel特性Parcel有以下一些特性:1、相比于Webpack, Rollup以及Browserify,Parcel打包时间极快这是Parcel做的一个基准测试,基于一个合理大小的应用,包含1726个模块, 6

[译]iOS开发可复用框架入门(实例)

当你编写一个iOS应用程序时,你通常会什么都不想就导入Foundation或UIKit框架。 如果要使用字符串,日期,文件系统或线程,可以导入Foundation。如果要使用UITableViewController或UIAlertController,则可以导入UIKit。 如果你导入了UIKit,那么可以完全忽略Foundation,因为UIKit在后台会导入它。关键是这些

IndexDB快速入门

IndexDB是适用于浏览器的文档数据库,它有以下特点:兼容所有现代的浏览器支持事务以及版本控制支持无限数量的数据。很多浏览器会限定localStorage或者sessionStorage的存储空间为2M到10MIndexDB是异步的API,它不会阻塞浏览器UI的渲染下面介绍下它的使用。安装依赖包idb需要把idb的js库添加到依赖。有几种方式添加idb到依赖。yarnyarn add&

React Apollo入门

入门Apollo Client最简单的方法是使用Apollo Boost,它会给客户端配置推荐的设置。使用Apollo Boost创建app的内容包括缓存,本地状态管理以及错误处理。安装首先安装以下的软件包:npm install apollo-boost react-apollo graphql-tag graphq

WebStorm console.log()的快捷键

WebStorm提供了Live Template的功能,可以在JavaScript模块下新建console.log()的快捷方式。File -> Settings -> Editor -> Live Templates 在JavaScript下新建模板,如设定缩写为.log,模板如下:console.

winsw快速注册Windows系统服务

winsw(Windows Service Wrapper)是一个开源项目,它可以让我们快速把一个可执行的程序注册为Windows的系统服务。下载安装下载地址:https://github.com/kohsuke/winsw/releases,如图:下载对应平台的.exe(.net2和.net4)。下载地址提供了两份配置文件:sample-allOptions.xml:包含所有配置项 s

Ubuntu 18.04快速安装gcc

默认的Ubuntu存储库包含一个名为build-essential的元包,它包含GCC编译器以及编译软件所需的许多库和其他实用程序。我们使用build-essential就可以快速安装gcc。1、更新包列表首先,我们先更新下apt的包列表:$ sudo apt update2、安装build-essential接着,我们就可以安装build-essential$ sudo apt install

MongoDB速查手册

列出所有的数据库show dbs显示当前数据db创建或者切换数据库use mydb删除数据库db.dropDatabase()创建集合Collectiondb.createCollection('users')列出数据库所有集合show collections插入一行数据/文档db.posts.insert({ title: '标题1', body: '内容', category: '

Tomcat 8.5新安装环境初步配置优化

下载安装Tomcatwget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v8.5.37/bin/apache-tomcat-8.5.37.tar.gztar zxf apache-tomcat-8.5.37.tar.gz -C /usr/localmv /usr/local/apache-tomcat-8.5.37 /usr/local/t

初识JPA

1、什么是JPA?        JPA的全称是Java Persistence API,翻译成中文就是java对象持久化应用程序接口。JPA是Sun公司在Java EE5中提出的java对象持久化应用程序接口。2、JPA的优势是什么?标准化对容器级特性支持简单易用,集成方便可媲美JDBC的查询能力支持面向对象的高级特性3、JPA的缺点是什么?性能不好?学习

JPA实体状态深入理解

我们在学习JPA实体状态的时候,常常会问,JPA的实体有多少状态呢?相信这个问题不难回答:瞬时态(transient)托管态(persistent)游离态(detached)移除态(removed)注意:这里最后一个移除态,有的时候也叫删除态(deleted),至于它和移除态有啥区别,暂时没有想到,如果您对此有更加深刻的理解,请留言回复。为什么会有这四种状态呢?啥,这个也有为啥,网上不是都这么说的