JPA

開始寫之前還是粘貼點what,why,how吧,想了解更多的信息請自行查看JPA官網教程.這裏就簡單點看看就過吧.

JPA是什麼?

Java持久性API(簡稱JAP)是類和方法的集合,以海量數據關係映射持久並存儲到數據庫,這是由Oracle公司提供方案技術。
在哪裏使用JPA?

爲了減少編寫代碼,對象關係管理的負擔,程序員遵循“JPA提供者”框架,它可以方便地與數據庫實例的交互。這裏所需要的框架接管JPA。

JPA提供者
JPA是一個開源的API,因此各企業廠商如Oracle,Redhat,Eclipse等,通過增加 JPA 持續性,在提供JPA的新產品。這些產品包括:
Hibernate, Eclipselink, Toplink, Spring Data JPA, etc.

一 入門CURD

Create:

EntityManagerFactory emfactory = Persistence.
	   			createEntityManagerFactory( "MyEclipse_JPA");
	   	EntityManager entitymanager = emfactory.
	   			createEntityManager();
	   	entitymanager.getTransaction().begin();
	   	
	   	Employee employee = new Employee(); 
	   	employee.setEname("Manisha");
	   	employee.setSalary(40000);
	   	employee.setDeg("接待員");
	   	entitymanager.persist(employee);
	   	entitymanager.getTransaction().commit();
	   	
	   	entitymanager.close();
	   	emfactory.close();
Update:

EntityManagerFactory emfactory = Persistence.
	   			createEntityManagerFactory( "MyEclipse_JPA" );
	   	EntityManager entitymanager = emfactory.
	   			createEntityManager( );
	   			entitymanager.getTransaction( ).begin( );
	   	Employee employee=entitymanager.
	   			find( Employee.class, 1 );
	   	
	   	//將所有實體變爲遊離狀態
	   	//entitymanager.clear();
	   	//將實體加入托管狀態
	   	//entitymanager.merge(employee);
	   	
	   	//before update
	   	System.out.println( employee );
	   	employee.setSalary( 46000 );
	   	entitymanager.getTransaction( ).commit( );
	        //after update
	   	System.out.println( employee );
	   	entitymanager.close();
	   	emfactory.close();
Retrieve:

EntityManagerFactory emfactory = Persistence.
	   			createEntityManagerFactory( "MyEclipse_JPA" );
		EntityManager entitymanager = emfactory.
	   			createEntityManager();
	   	Employee employee = entitymanager.
	   			find( Employee.class, 1 );
	   	/*延遲加載
	   	Employee employee = entitymanager.
	   			getReference( Employee.class, 1 );
	   			*/
	   	System.out.println("employee ID = "+employee.getEid( ));
	   	System.out.println("employee NAME = "+employee.getEname( ));
	   	System.out.println("employee SALARY = "+employee.getSalary( ));
	   	System.out.println("employee DESIGNATION = "+employee.getDeg( ));
Delete:

EntityManagerFactory emfactory = Persistence.
	   			createEntityManagerFactory( "MyEclipse_JPA" );
	   	EntityManager entitymanager = emfactory.
	   			createEntityManager( );
	   	entitymanager.getTransaction( ).begin( );
	   	Employee employee=entitymanager.
	   			find( Employee.class, 1 );
	   	entitymanager.remove( employee );
	   	entitymanager.getTransaction( ).commit( );
	   	entitymanager.close( );
	   	emfactory.close( );
實體Employee類如下:

package yzr.entity;

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

@Entity
@Table

public class Employee {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int eid;
	private String ename;
	private double salary;
	private String deg;

	public Employee(int eid, String ename, double salary, String deg) {
		super();
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}

	public Employee() {
		super();
	}

	public int getEid() {
		return eid;
	}

	public void setEid(int eid) {
		this.eid = eid;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	public String getDeg() {
		return deg;
	}

	public void setDeg(String deg) {
		this.deg = deg;
	}

	@Override
	public String toString() {
		return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
				+ salary + ", deg=" + deg + "]";
	}
}

持久化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="MyEclipse_JPA" 
                        transaction-type="RESOURCE_LOCAL">
    
       <properties>
           <property name="javax.persistence.jdbc.url"
                   value="jdbc:mysql://123.207.89.**:3306/jpa"/>
           <property name="javax.persistence.jdbc.user" value="root"/>
           <property name="javax.persistence.jdbc.password" value="*****"/>
           <property name="javax.persistence.jdbc.driver"
                   value="com.mysql.jdbc.Driver"/>
           <property name="hibernate.show_sql" value="true" />      
           <property name="hibernate.hbm2ddl.auto" value="create" />
       </properties>
   </persistence-unit>
</persistence>

整個資源文件示意圖如下:


二 持久化查詢語言

JPQL代表Java持久化查詢語言。它被用來創建針對實體的查詢存儲在關係數據庫中。 JPQL是基於SQL語法的發展。但它不會直接影響到數據庫。
JPQL可以檢索使用SELECT子句中的數據,可以使用 UPDATE子句做批量UPDATE和DELETE子句。

面向對象進行編寫一些類似sql的查詢語言:

EntityManagerFactory emfactory = Persistence
				.createEntityManagerFactory("MyEclipse_JPA");
		EntityManager entitymanager = emfactory.createEntityManager();
		// sql函數
		Query query = entitymanager
				.createQuery("Select UPPER(e.ename) from Employee e");
		List<String> list1 = query.getResultList();

		for (String e : list1) {
			System.out.println("Employee NAME :" + e);
		}
		// 聚合函數
		Query query1 = entitymanager
				.createQuery("Select MAX(e.salary) from Employee e");
		Double result = (Double) query1.getSingleResult();
		System.out.println("Max Employee Salary :" + result);
		// Between
		query = entitymanager.createQuery("Select e " + "from Employee e "
				+ "where e.salary " + "Between 30000 and 40000");
		List<Employee> list = (List<Employee>) query.getResultList();

		for (Employee e : list) {
			System.out.print("Employee ID :" + e.getEid());
			System.out.println("\t Employee salary :" + e.getSalary());
		}
		// Like
		query1 = entitymanager.createQuery("Select e " + "from Employee e "
				+ "where e.ename LIKE 'M%' order by e.ename");
		List<Employee> list2 = (List<Employee>) query1.getResultList();
		for (Employee e : list2) {
			System.out.print("Employee ID :" + e.getEid());
			System.out.println("\t Employee name :" + e.getEname());
		}

命名查詢:

package yzr.entity;

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

@Entity
@Table
@NamedQuery(query = "Select e from Employee e where e.eid = :id", 
name = "find employee by id")
public class Employee {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private int eid;
	private String ename;
	private double salary;
	private String deg;

	public Employee(int eid, String ename, double salary, String deg) {
		super();
		this.eid = eid;
		this.ename = ename;
		this.salary = salary;
		this.deg = deg;
	}

	public Employee() {
		super();
	}

	public int getEid() {
		return eid;
	}

	public void setEid(int eid) {
		this.eid = eid;
	}

	public String getEname() {
		return ename;
	}

	public void setEname(String ename) {
		this.ename = ename;
	}

	public double getSalary() {
		return salary;
	}

	public void setSalary(double salary) {
		this.salary = salary;
	}

	public String getDeg() {
		return deg;
	}

	public void setDeg(String deg) {
		this.deg = deg;
	}

	@Override
	public String toString() {
		return "Employee [eid=" + eid + ", ename=" + ename + ", salary="
				+ salary + ", deg=" + deg + "]";
	}
}

//命名查詢
		query = entitymanager.createNamedQuery("find employee by id");
		query.setParameter("id", 1);
		List<Employee> list3 = query.getResultList();
		for (Employee e : list3) {
			System.out.print("Employee ID :" + e.getEid());
			System.out.println("\t Employee Name :" + e.getEname());
		}

三 實體映射

繼承策略
繼承是任何面嚮對象語言的核心理念,因此我們可以用實體之間的繼承關係和策略。JPA支持三種類型的繼承策略:SINGLE_TABLE,JOINED_TABLE和TABLE_PER_CONCRETE_CLASS。

第一種:單一表策略

package yzr.entity;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn( name="type" )
public class Animal {
	@Id
	@GeneratedValue( strategy = GenerationType.IDENTITY )
	private int aid;
	private String aname;
	private int leg;
	
	public Animal(){
		
	}
    public Animal(String name,int leg){
		this.aname=name;
		this.leg=leg;
	}
	public int getAid() {
		return aid;
	}
	public void setAid(int aid) {
		this.aid = aid;
	}
	public String getAname() {
		return aname;
	}
	public void setAname(String aname) {
		this.aname = aname;
	}
	public int getLeg() {
		return leg;
	}
	public void setLeg(int leg) {
		this.leg = leg;
	}
}

package yzr.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue( value="Cat" )
public class Cat extends Animal {
	private String skill;
	public Cat(){}
	public Cat(String name,int leg,String skill){
		super(name,leg);
		this.skill=skill;
	}
	public String getSkill() {
		return skill;
	}
	public void setSkill(String skill) {
		this.skill = skill;
	}
	
}

package yzr.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue( value="Dog" )
public class Dog extends Animal {
	private String action;
	
	
	public Dog(String name,int leg,String action){
		super(name,leg);
		this.action=action;
	}
	public Dog(){
		
	}
	public String getAction() {
		return action;
	}
	public void setAction(String action) {
		this.action = action;
	}
	
	
}
package yzr.mapping;

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

import yzr.entity.Cat;
import yzr.entity.Dog;

public class singletable {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		EntityManagerFactory emfactory = Persistence.
	   			createEntityManagerFactory( "MyEclipse_JPA" );
	   	EntityManager entitymanager = emfactory.
	   			createEntityManager( );
	   	entitymanager.getTransaction( ).begin( );
	   	
	   	//Cat entity 
	   	Cat c1=new Cat(
	   			"miaomiao",4,"sleep");
	   	Cat c2=new Cat(
	   			"Tom",2,"抓老鼠");
	   	//Dog entity
	   	Dog d1=new Dog(
	   			"wangwang", 4,"看家");
	   	Dog d2=new Dog(
	   			"包哥", 4,"吃");
	   	
	   	//storing all entities
	   	entitymanager.persist(c1);
	   	entitymanager.persist(c2);
	   	entitymanager.persist(d1);
	   	entitymanager.persist(d2);
	   	entitymanager.getTransaction().commit();
	   	entitymanager.close();
	   	emfactory.close();

	}

}

持久化文件persistence.xml保持和上面一致就可以了.

數據庫會自動生成一張Animal表:



第二種:註冊策略表

package yzr.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.JOINED )
public class Person {
	@Id
	@GeneratedValue( strategy = GenerationType.IDENTITY )
	private int id;
	private String name;
	private int sex;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getSex() {
		return sex;
	}
	public void setSex(int sex) {
		this.sex = sex;
	}
	
	public Person(){}
	public Person(String name,int sex){
		this.name=name;
		this.sex=sex;
	}
}

package yzr.entity;

import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;

@Entity
@PrimaryKeyJoinColumn(referencedColumnName="id")
public class Student extends Person {
	private String roleName;
	public Student(){}
	public Student(String name,int sex,String roleName){
		super(name,sex);
		this.roleName=roleName;
	}
	public String getRoleName() {
		return roleName;
	}
	public void setRoleName(String roleName) {
		this.roleName = roleName;
	}
	
}

package yzr.entity;

import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;

@Entity
@PrimaryKeyJoinColumn(referencedColumnName="id")
public class Teacher extends Person {
	public String bigCall;
	public Teacher(){}
	public Teacher(String name,int sex,String bigCall){
		super(name,sex);
		this.bigCall=bigCall;
	}
	public String getBigCall() {
		return bigCall;
	}
	public void setBigCall(String bigCall) {
		this.bigCall = bigCall;
	}
	
}	

package yzr.mapping;

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

import yzr.entity.Student;
import yzr.entity.Teacher;

public class joined {
	public static void main(String[] args) {
		EntityManagerFactory emfactory = Persistence.
	   			createEntityManagerFactory( "MyEclipse_JPA" );
	   	EntityManager entitymanager = emfactory.
	   			createEntityManager( );
	   	entitymanager.getTransaction( ).begin( );
	   	
	   	//Cat entity 
	   	Student s1=new Student(
	   			"miaomiao",1,"讀書睡覺");
	   	Student s2=new Student(
	   			"Tom",2,"不寫作業");
	   	//Dog entity
	   	Teacher t1=new Teacher(
	   			"wangwang", 1,"打人");
	   	Teacher t2=new Teacher(
	   			"包哥", 2,"瞪眼");
	   	
	   	//storing all entities
	   	entitymanager.persist(s1);
	   	entitymanager.persist(s2);
	   	entitymanager.persist(t1);
	   	entitymanager.persist(t2);
	   	entitymanager.getTransaction().commit();
	   	entitymanager.close();
	   	emfactory.close();
	}
}

數據庫生成三種表:person ,student,teacher:



第三種:每個類表策略

package yzr.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )
public class Language {
	@Id
	@GeneratedValue( strategy = GenerationType.TABLE )
	public int id;
	public String Country;
	
	public Language(){}
	public Language(String Country){
		this.Country=Country;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getCountry() {
		return Country;
	}
	public void setCountry(String country) {
		Country = country;
	}
	
}

package yzr.entity;

import javax.persistence.Entity;

@Entity
public class Chinese extends Language {
	public String sayhello;
	public Chinese(){};
	public Chinese(String country,String sayhello){
		super(country);
		this.sayhello=sayhello;
	}
	public String getSayhello() {
		return sayhello;
	}
	public void setSayhello(String sayhello) {
		this.sayhello = sayhello;
	}
	
}

package yzr.entity;

import javax.persistence.Entity;

@Entity
public class English extends Language {
	public String sayByeBye;
	public English(){};
	public English(String country,String sayByeBye){
		super(country);
		this.sayByeBye=sayByeBye;
	}
	public String getSayByeBye() {
		return sayByeBye;
	}
	public void setSayByeBye(String sayByeBye) {
		this.sayByeBye = sayByeBye;
	}
	
}
package yzr.mapping;

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

import yzr.entity.Chinese;
import yzr.entity.English;


public class tablepreclass {
	public static void main(String[] args) {
		EntityManagerFactory emfactory = Persistence.
	   			createEntityManagerFactory( "MyEclipse_JPA" );
	   	EntityManager entitymanager = emfactory.
	   			createEntityManager( );
	   	entitymanager.getTransaction( ).begin( );
	   	
	   	//Chinese entity 
	   	Chinese s1=new Chinese(
	   			"miaomiao","讀書睡覺");
	   	Chinese s2=new Chinese(
	   			"Tom","不寫作業");
	   	//English entity
	   	English t1=new English(
	   			"wangwang","打人");
	   	English t2=new English(
	   			"包哥", "瞪眼");
	   	
	   	//storing all entities
	   	entitymanager.persist(s1);
	   	entitymanager.persist(s2);
	   	entitymanager.persist(t1);
	   	entitymanager.persist(t2);
	   	entitymanager.getTransaction().commit();
	   	entitymanager.close();
	   	emfactory.close();
	}
}數據庫生成三張表,其中一張父表爲空表:

四 persistence.xml:

從網上找到的關於持久化配置文件每個節點的說明:

<?xml version="1.0" encoding="UTF-8"?>  
  
<persistence version="1.0"  
xmlns:persistence="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 persistence_1_0.xsd ">  
  
<!--    
     Name屬性用於定義持久化單元的名字 (name必選,空值也合法);   
     transaction-type 指定事務類型(可選)    
-->  
<persistence-unit name="unitName" transaction-type="JTA">  
  
   <!-- 描述信息.(可選) -->  
   <description> </description>  
  
   <!-- javax.persistence.PersistenceProvider接口的一個實現類(可選) -->  
   <provider>   </provider>  
  
   <!-- Jta-data-source和 non-jta-data-source用於分別指定持久化提供商使用的JTA和/或non-JTA數據源的全局JNDI名稱(可選) -->  
   <jta-data-source>java:/MySqlDS</jta-data-source>  
   <non-jta-data-source> </non-jta-data-source>  
  
   <!-- 聲明orm.xml所在位置.(可選) -->  
   <mapping-file>product.xml</mapping-file>  
  
   <!-- 以包含persistence.xml的jar文件爲基準的相對路徑,添加額外的jar文件.(可選) -->  
   <jar-file>../lib/model.jar</jar-file>  
  
   <!-- 顯式列出實體類,在Java SE 環境中應該顯式列出.(可選) -->  
   <class>com.domain.User</class>  
   <class>com.domain.Product</class>  
  
   <!-- 聲明是否掃描jar文件中標註了@Enity類加入到上下文.若不掃描,則如下:(可選) -->  
   <exclude-unlisted-classes/>  
  
   <!--   廠商專有屬性(可選)   -->  
   <properties>  
    <!-- hibernate.hbm2ddl.auto= create-drop / create / update -->  
    <property name="hibernate.hbm2ddl.auto" value="update" />  
    <property name="hibernate.show_sql" value="true" />  
   </properties>  
  
</persistence-unit>  
  
</persistence>

五 實體關係

@ManyToOne關係
@OneToMany 關係
@OneToOne 關係
@ManyToMany 關係

@ManyToOne
private Department department;


@OneToMany( targetEntity=Employee.class )
private List employeelist;


JPA教程:http://www.yiibai.com/jpa/jpa_entity_relationships.html

本文案列代碼下載:代碼

發佈了55 篇原創文章 · 獲贊 64 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章