hibernate之JPA入门篇
所谓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
表生成成功!!!