欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

hibernate之JPA入门篇

程序员文章站 2022-06-09 14:50:28
...

所谓JPA就是Java  persistence api----java持久化标准。

由来:大家都知道hibernate是持久层框架都先驱,出世备受瞩目,一个东西出名就就会有无数的追随者,于是市面上出现了很多持久层框架,但各自的方法名称都不同,你的更新方法叫update,我就叫change!这样到最后搞得很乱,给开发者带来很多问题。于是sun公司(当然现在是oracle了)就让hibernate带头搞一套Java持久化框架的标准,以后只要再是持久化框架,大家都来支持这个标准,那么开发者用起来就顺畅多了,这就是JPA.

hibernate为了不修改自己原来辛辛苦苦打造的框架,所以不修改之前的的各种方法,所以我们用hibernate做持久化的时候依然可以用它自己独有的那一套完全没问题,不过它也支持了JPA,所以今天来看看如何在hibernate基础上使用JPA.


第一步:导包

hibernate自带JPA的jar包,因为版本不一样可能路径会有差异,我的在hibernate-release-5.3.1.Final/lib/jpa-metamodel-generator这个目录下,导入以后记得build path.

第二步:写我们JPA的主配置文件----persistence.xml

在src下建META-INF文件夹,然后在这个文件夹下新建persistence.xml文件。这里注意文件夹路径名字及xml文件路径名字都是固定的,不能*发挥,因为JPA在获取EntityManagerFactory的时候可没有给你提供对应方法让你传配置文件的路径!

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
	http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" 
	version="2.0"> 
	
<persistence-unit name="jpaUnit" transaction-type="RESOURCE_LOCAL">//这里name随意起,但万一有多个时不能重复,事务类型固定写法
	<properties>
		<property name="" value=""/>
		<property name="" value="org.hibernate.dialect.MySQLMyISAMDialect"/>
			<property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver"/>
			<property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/testDB"/>
			<property name="hibernate.connection.username" value="username"/>
			<property name="hibernate.connection.password" value="password"/>
			<!-- 第二部分,hibernate可选配置 -->
			<property name="hibernate.show_sql" value="true"/>
			<property name="hibernate.format_sql" value="true"/>
			<property name="hibernate.hbm2ddl.auto" value="update"/>
			<property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider"/>
			<property name="hibernate.current_session_context_class" value="thread"/>
	</properties>
	</persistence-unit>
</persistence>

写这个配置文件时开始老不提示,去xml catagory里关联了也都还是不提示,原因就是最上面引入schema申明出错了,粘贴时小心点。。。

顺带说一下需要关联的那个xsd文件位置吧(因hibernate版本会有差异):

hibernate-release-5.3.1.Final/project/hibernate-core/src/main/resources/org/hibernate/jpa


第三步:创建一个实体类,并用注解的方式生成表,如下

package com.dimples.dao;

import java.io.Serializable;

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

@Entity    //标明这仅仅就是个实体类,其他啥都不干
@Table(name="customer")    //指定生成对应表的名称
public class Customer implements Serializable {
	
	@Id    //标明这个字段时主键
	@Column(name="id")    //指明这个属性对应的字段名
	@GeneratedValue(strategy=GenerationType.IDENTITY)    //主键生成策略
	private Integer id;
	
	@Column(name="name")
	private String name;
	
	@Column(name="address")
	private String address;
	
	@Column(name="level")
	private String level;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getLevel() {
		return level;
	}
	public void setLevel(String level) {
		this.level = level;
	}
	@Override
	public String toString() {
		return "Customer [id=" + id + ", name=" + name + ", address=" + address + ", level=" + level + "]";
	}
	
	
}

这是一个获取 EntityManager的工具类:

public class MyJPAUtils {
	private static EntityManagerFactory factory;
	static {
        //通过单元名称直接生成对应工厂,不需要指定主配置文件的路径,相当于hibernate中的SessionFactory
factory = Persistence.createEntityManagerFactory("jpaUnit");}public static EntityManager getEntityManager() {return factory.createEntityManager();//相当于hibernate中的session}}

最后写个测试类跑一下:

public static void main(String[] args) {
		EntityManager entityManager = MyJPAUtils.getEntityManager();
	}

结果:

Hibernate: 
    
    create table customer (
       id integer not null auto_increment,
        address varchar(255),
        level varchar(255),
        name varchar(255),
        primary key (id)
    ) engine=InnoDB
表生成成功!!!