jpa入门

本文介绍了Java Persistence API(JPA)的基本概念与应用场景,详细讲解了如何在Java项目中配置并使用JPA进行数据库操作,包括实体映射、增删改查等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JPA全称为Java Persistence API ,Java持久化API是Sun公司在Java EE 5规范中提出的Java持久化接口。JPA吸取了目前Java持久化技术的优点,旨在规范、简化Java对象的持久化工作。使用JPA持久化对象,并不是依赖于某一个ORM框架。

项目基本结构:


1、新建java项目或web项目,因为jpa属于持久层,与前端无关

所需架包见下面的资源,因为jpa是规范所以有些需要hibernate或者其他方式实现

http://download.youkuaiyun.com/detail/yongzhian/8100313

2 /jpa/src/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" 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">
 <persistence-unit name="mysqlJPA" transaction-type="RESOURCE_LOCAL">  
        <properties>  
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />  
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />  
            <property name="hibernate.connection.username" value="admins" />  
            <property name="hibernate.connection.password" value="root" />  
            <property name="hibernate.connection.url" value="jdbc:mysql://10.6.0.204:3306/commonuser" />  
            <property name="hibernate.max_fetch_depth" value="3" />  
            <property name="hibernate.hbm2ddl.auto" value="update" />  
        </properties>  
    </persistence-unit> 
     <persistence-unit name="mysqlJPA1" transaction-type="RESOURCE_LOCAL"> <!--只是用于说明 -->  
        <properties>  
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />  
            <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" />  
            <property name="hibernate.connection.username" value="admins" />  
            <property name="hibernate.connection.password" value="root1" />  
            <property name="hibernate.connection.url" value="jdbc:mysql://10.6.0.204:3306/commonuser" />  
            <property name="hibernate.max_fetch_depth" value="3" />  
            <property name="hibernate.hbm2ddl.auto" value="update" />  
        </properties>  
    </persistence-unit> 
    
</persistence>

EntityManager对象的事务管理方式有两种,分别为JTA和RESOURCE_LOCAL,即Java Transaction API方法和本地的事务管理。

JTA事务

(Java Transaction API)是J2EE规范中有关事务的标准。它是容器级别的事务,只能运行在J2EE服务器中。它的最大优势是可以支持分布式的事务,如果系统采用的是分布式的数据库,那么只能选择JTA管理EntityManager事务。

使用JTA管理EntityManager事务时,需要注意以下几个问题。

— JTA事务只能运行在J2EE的环境中,即EJB容器中和Web容器中;而在J2SE环境中只能使用RESOURCE_LOCAL管理事务。

RESOURCE_LOCAL管理事务

RESOURCE_LOCAL事务数据库本地的事务。它是数据库级别的事务,只能针对一种数据库,不支持分布式的事务。对于中小型的应用,可以采用RESOURCE_LOCAL管理EntityManager事务。

使用RESOURCE_LOCAL管理EntityManager事务时需要注意以下几个问题。

— 在J2SE环境中,只能使用RESOURCE_LOCAL管理EntityManager事务,并且EntityManager对象是以应用托管方式获得的。

— 代码中使用RESOURCE_LOCAL管理事务时,要通过调用EntityManager的getTransac- tion()方法获得本地事务对象。

采用RESOURCE_LOCAL管理事务时,要保证数据库支持事务。例如使用MySQL时,需要设置数据库的引擎类型为“InnoDB”,而“MyISAM”类型是不支持事务的。


3     /jpa/src/com/base/test/BaseJunit.java


package com.base.test;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.junit.BeforeClass;
import org.junit.Test;

import com.bean.Person;

public class BaseJunit {
	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@Test
	public void createTable() {
		// 可以验证生成表是否正确
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mysqlJPA");
		factory.close();
	}

	@Test
	public void save() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mysqlJPA");//如果写null会找第一个persistence-unit 
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Person person = new Person(); // person为new状态 
		person.setName("zhang san");
		em.persist(person); // 持久化实体
		em.getTransaction().commit();
		em.close();
		factory.close();
	}
	// new 、托管、脱管、删除

	@Test
	public void update() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mysqlJPA");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Person person = em.find(Person.class, 1);
		person.setName("hmk"); // person为托管状态
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	@Test
	public void update2() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mysqlJPA");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Person person = em.find(Person.class, 1);
		em.clear(); // 把实体管理器中的所有实体变为脱管状态
		person.setName("hmk2");
		em.merge(person); // 把脱管状态变为托管状态,merge可以自动选择insert or update 数据
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	@Test
	public void remove() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mysqlJPA");
		EntityManager em = factory.createEntityManager();
		em.getTransaction().begin();
		Person person = em.find(Person.class, 1);
		em.remove(person); // 删除实体
		em.getTransaction().commit();
		em.close();
		factory.close();
	}

	@Test
	public void find() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mysqlJPA");
		EntityManager em = factory.createEntityManager();
		Person person = em.find(Person.class, 2); // 类似于hibernate的get方法,没找到数据时,返回null
		System.out.println(person.getName());
		em.close();
		factory.close();
	}

	@Test
	public void find2() {
		EntityManagerFactory factory = Persistence
				.createEntityManagerFactory("mysqlJPA");
		EntityManager em = factory.createEntityManager();
		Person person = em.getReference(Person.class, 2); // 类似于hibernate的load方法,延迟加载.没相应数据时会出现异常
		System.out.println(person.getName()); // 真正调用时才查找数据
		em.close();
		factory.close();
	}
}
@PersistenceContext (unitName="mysqlJPA")  只能是javaEE中实现,javaSE中需要与Hibernate配合设置

3 /jpa/src/com/bean/Person.java

/**
 * @Project: jpa
 * @Title: Person.java
 * @Package com.bean
 * @author yongzhian
 * @date 2014-10-30 下午2:20:23
 * @Copyright: 2014 www.yineng.com.cn Inc. All rights reserved.
 * @version V1.0
 */
package com.bean;

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

/**
 * @ClassName Person
 * @Description 模块描述
 * @author yongzhian
 * @Date 2014-10-30
 */
@Entity
@Table(name="user_baseinfo")
public class Person {
	
	@Id
	@Column(name = "info_id")
	@GeneratedValue(strategy = GenerationType.AUTO)
	private Integer id;

	@Column(name = "info_name")
	private String name;

	/**
	 * @return id
	 */
	public Integer getId() {
		return id;
	}

	/**
	 * @param id 要设置的 id
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * @return name
	 */
	public String getName() {
		return name;
	}

	/**
	 * @param name 要设置的 name
	 */
	public void setName(String name) {
		this.name = name;
	}

}

JPA注解 :(http://blog.youkuaiyun.com/zzkk_1980/article/details/6015410)

1、@Entity(name="EntityName")

2、@Table(name="",catalog="",schema="")

3、@id

4、@GeneratedValue(strategy=GenerationType,generator="")

5、@Basic(fetch=FetchType,optional=true)

6、@Column

7、@Transient

8、@ManyToOne(fetch=FetchType,cascade=CascadeType)

9、@JoinColumn

10、@OneToMany(fetch=FetchType,cascade=CascadeType)

11、@OneToOne(fetch=FetchType,cascade=CascadeType)

12、@ManyToMany

13、@MappedSuperclass

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值