`
拓子轩
  • 浏览: 210066 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

JPA开发

阅读更多

1. 什么是JPA

1. JPA(Java Persistence API)Sun官方提出的Java持久化规范。它为Java开发人员提供了一种对象/关系映射工具来管理Java应用中的关系数据。他的出现主要是为了简化现有的持久化开发工作和整合ORM技术,结束现在HibernateTopLinkJDOORM框架各自为营的局面。值得注意的是,JPA是在充分吸收了现有HibernateTopLinkJDOORM框架的基础上发展而来的,具有易于使用、伸缩性强等优点。从目前的开发社区的反应上看,JPA受到了极大的支持和赞扬,其中就包括了SpringEJB3.0的开发团队。着眼未来几年的技术走向,JPA作为ORM领域标准化整合者的目标应该不难实现。

2. JPA的总体思想和现有HibernateTopLinkJDOORM框架大体一致,总的来说,JPA包括以下3方面的技术:

2.1 ORM映射元数据

JPA支持XMLJDK5.0注释(注解)两种元数据的形式,元数据描述对象和表之间的映射关系,框架据此将实体对象持久化到数据库表中。

2.2 Java持久化API

用来操作实体对象,执行CRUD操作,框架在后台替我们完成所有的事情,开发者可以从繁琐的JDBCSQL代码中解脱出来。

2.3 查询语言

这是持久化操作中很重要的一个方面,通过面向对象而非面向数据库的查询语言查询数据,避免程序的SQL语句紧密耦合。

提示:JPA不是一种新的ORM框架,他的出现只是用于规范现有的ORM技术,它不能取代现有的HibernateTopLinkORM框架。相反,在采用JPA开发时,我们仍将使用这些ORM框架,只是此时开发出来的应用不再依赖于某个持久化提供商。应用可以在不修改代码的情况下在任何JPA环境下运行,真正做到低耦合,可扩展的程序设计。

2. 开发JPA依赖的jar文件

Hibernate核心包(8个文件)

hibernate-distribution-3.3.1.GA

hibernate3.jar

lib\bytecode\cglib\hibernate-cglib-repack-2.1_3.jar

lib\required\*.jar

Hibernate注解包(3个文件)hibernate-annotations-3.4.0.GA

hibernate-annotations.jar

lib\ejb3-persistence.jarhibernate-commons-annotations.jar

Hibernate针对JPA的实现包(3个文件):hibernate-entitymanager-3.4.0.GA

hibernate-entitymanager.jar

lib\test\log4j.jarslf4j-log4j12.jar

3.JPA的配置文件

JPA规范要求在类路径的META-INF目录下放置persistence.xml, 文件的名称是固定的,配置模板如下:

<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_1_0.xsd"

   version="1.0">

   <persistence-unit name="itcast" transaction-type=”RESOURCE-LOCAL”>

      <properties>

         <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>

         <property name=”hibernate.connection.driver_class” value=”org.gjt.mm.mysql.Driver” />

         <property name=”hibernate.connection.username” value=”root” />

         <property name=”hibernate.connection.password” value=”root” />

         <property name=”hibernate.connection.url”

 value=”jdbc:mysql://localhost:3306/itcast?useUnicode=true&amp;characterEncoding=UTF-8”/>

         <property name=”hibernate.max_fetch-depth” value=”3” />

         <property name="hibernate.hbm2ddl.auto" value="update"/>

      </properties>

   </persistence-unit>

</persistence>

4. JPA实例

建立一个名为JPAjava project, src目录下新建META-INF文件夹,并把persistence.xml文件放入其中

建立实体bean

package cn.itcast.bean;

import javax.persistence.Entity;

import javax.persistentce.GeneratedValue;

import javax.persistentce.GeneratedType;

import javax.persistentce.Id;

 

@Entity

@Table(name=”xxx”)

public class Person {

private Integer id;

private String name;

private Date birthday; //1887-12-10

private Gender gerder = Gender.MAN;

private String info;  //存放大文本数据

private Byte[] file;   //大数据(大于1M)延迟加载

private String imagepath;  //不希望该字段映射到数据库

 

public Person(String name) {

    this.name = name;

}

 

@Id @GeneratedValue

public Integer getId() {
        return id;

}

public void setId(Integer id) {

    this.id = id;

}

@Column(length=10,nullable=false,name=”personName”)

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

@Temporal(TemporalType.DATE)

public Date getBirthday() {

    return birthday;

}

public void setBirthday(Date birthday) {

    this.birthday = birthday;

}

@Enumerated(EnumType.STRING)

@Column(length=5,nullable=false)

public Gender getGender() {

    return gender;

}

public vod setGender(Gender gender) {

    this.gender = gender;

}

@Lob

public String getInfo {

    return info;

}

public void setInfo(String info) {

    this.info = info;

}

@Lob @Basic(fetch=FetchType.LAZY)

public Byte[] getFile() {

    return file;

}

public void setFile(Byte[] file) {

    this.file = file;

}

@Transient

publc String getImagepath() {

    return imagepath;

}

public void setImagepath(String imagepath) {

    this.imagepath = imagepath;

}

}

枚举类

package cn.itcast.bean;

public enum Gender {

    MAM,WOMEN

}

 

测试代码

package junit.test;

 

public class PersonTest {

 

@Test public void save() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();   //开始事务

    em.persist(new Persion(“传智博客”));   //new状态

    em.getTransaction().commit();

    em.close();

    factory.close();

}

@Test public void getPerson() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    Person person = em.find(Person.class,1);

    System.out.println(person.getName());

    em.close();

    factory.close();

}

@Test public void getPerson() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    Person person = em.getReference(Person.class,1);

    System.out.println(person.getName());

    em.close();

    factory.close();

}

 

@Test public void updatePerson() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();   //开始事务

    Person person = em.find(Person.class,1);  //托管状态

    person.setName (“老张”);  //处于托管状态,对person的修改可以同步到数据库

    //em.clear();  //把实体管理器的所有实体变成游离状态

    em.getTransaction().commit();

    em.close();

    factory.close();

}

@Test public void updatePerson2() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();   //开始事务

    em.clear();  //把实体管理器的所有实体变成游离状态

    person.setName (“老黎”);  //处于托管状态,对person的修改可以同步到数据库

    em.merge(person);

    em.getTransaction().commit();

    em.close();

    factory.close();

}

@Test public void delete() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    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 query() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

        Query query = em.createQuery(“select o from Person o where o.id=?1”);

        query.setParameter(1,2);

        List<Person> persons = query.getResultList();

        for(Person person:persons)

            System.out.println(person.getName());

    em.close();

    factory.close();

}

@Test public void deletequery() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();

        Query query = em.createQuery(“delete from Person o where o.id=?1”);

        query.setParameter(1,2);

        query.executeUpdate();

    em.getTransaction().commit();

    em.close();

    factory.close();

}

 

@Test public void queryupdate() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();   //开始事务

    Query query = em.createQuery(“update Person o set o.name=:name where o.id=:id”);

    query.setParameter(“name”,”xxx”);

    query.setParameter(“id”,3);

    query.executeUpdate();

    em.getTransaction().commit();

    em.close();

    factory.close();

}

}

5. JPA中的一对多双向关联与级联操作

多的一方为关系维护端,关系维护端负责外键记录的更新,关系被维护端是没有权利更新外键记录

package cn.itcast.bean;

import javax.persistence.Entity;

@Entity

public class OrderItem {

private Integer id;

private String productName;

private Float sellPrice = 0f;

private Order order;

 

@Id @GeneratedValue

public Integer getId() {

    return id;

}

public setId(Integer id) {

    this.id = id;

}

@Column(length=40,nullable=false)

public String getProductName() {

    return productName;

}

public void setProductName(String productName) {

    this.productName = productName;

}

@Column(nullable=false)

public Float getSellPrice() {

    return sellPrice;

}

public void setSellPrice (Float sellPrice) {

    this. sellPrice = sellPrice

}

@ManyToOne(cascade={ascadeType.MERGE, CascadeType.REFERSH},optional=false)

@JoinColumn(name=”order_id”)

public Order getOrder() { //默认立即加载

    return order;

}

public void setOrder(Order order) {

   this.order = order;

}

}

Order实体

 

@Entity

@Table(name=”orders”)

public class Order {

private String orderid;

private Float amount = 0f;

private Set<OrderItem> items = new HashSet<OrderItem>();

 

@Id @Column(length=12)

public String getOrderid() {

    return ordered;

}

public void setOrderid(String ordered) {

    this.orderid = ordered;

}

@Column(nullable=false)

public Float getAmount() {

    return amount;

}

public void setAmount(Float amount) {

    this.amount = amount;

}

@OneToMany(cascade={CascadeType.REFRESH,CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REMOVE},fetch=FetchType.LAZYmappedBy=”order”)

public Set<OrderItem> getItems() {  //默认延迟加载

    return items;

}

public void setItems(Set<OrderItem> items) {

    this.items = items;

}

保存操作

public class OneToManyTest {

 @Test public void save() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();   //开始事务

 

    Order order = new Order();

    order.setAmout(34f);

    order.setOrderid(“999”);

    OrderItem orderItem1 = new OrderItem();

    orderItem1.setProductName(“足球”);

    orderItem1.setSellPrice(90f);

    OrderItem orderItem2 = new OrderItem();

    orderItem1.setProductName(“瑜伽球”);

    orderItem1.setSellPrice(30f);

    order.addOrderItem(orderItem1);

    order.addOrderItem(orderItem2);

 

    em.persist(order);

    em.getTransaction().commit();

    em.close();

    factory.close();

}

}

6. JPA中一对一双向关联

Peron实体

@Entity

public class Person {

private Integer id;

private String name;

private IDCard idcard;

public Person(){}

public Public(String name) { this.name = name }

@Id @GeneratedValue

public Integer getId() {

    return id;

}

public void setId(Integer id) {

    this.id = id;

}

public String getName() {

    return name;

}

pubic void setName() {

    this.name = name;

}

@OneToOne(optional=false,cascade=CascadeType.ALL)

@JoinColumn(name=”idcard_id”)

public IDCard getIdcard() {

    return idcard;

}

public void setIdcard(IDCard idcard) {

    this.idcard = idcard;

}

}

 

IDCard实体

public class IDCard {

private Integer id;

private String cardno;

private Persion person;

public IDCard (){}

public IDCard (String cardno) { this.cardno = cardno; }

 

@Id @GeneratedValue

public Integer getId() {

    return id;

}

pubic void setId(Integer id) {

    this.id = id;

}

@Column(length=18,nullable=false)

public String getCardno() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

@OneToOne(mappedBy=”idcard”,cascade={CascadeType.PERSIST,CascadeType.MERGE,CascadeType.REFRESH},optional=”false”)

public Person getPerson() {

    return person;

}

pubic void setPerson(Person person) {

    this.person = person;

}

}

保存操作

public class OneToManyTest {

 @Test public void save() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();   //开始事务

   

    Person person = new Person(“老张”);

    IDCard idcard = new IDCard(“11111”);

 

    em.persist(person);

    em.getTransaction().commit();

    em.close();

    factory.close();

}

}

7. JPA中多对多双向关联

public class Student {

private Integer id;

private String name;

private Set<Teacher> teachers= new HashSet<Teacher>();

public Student() {}

public Student(String name) { this name = name; }

@Id @GeneratedValue

public Integer getId() {…}

public void setId(Integer id) {…}

@Column(length=10,nullable=false)

public String getName() {…}

public void setId(String name){…}

@ManyToMany(cascade=CascadeType.REFRESH)

@JoinTable(name=”student_teacher”,inverseJoinColumns=@JoinColumn(name=”teacher_id”),joinColumns=@JoinColumn(name=”student_id”))

public Set<Teacher> getTeacher() {…}

public void setTeacher(Set<Teacher> teacher) {…}

}

Teacher实体

@Entity

public class Teacher

private Integer id;

private String name;

private Set<Student> student = new HashSet< Student >();

public Teacher() {}

public Teacher(String name) { this.name = name; }

@Id @GeneratedValue

public Integer getId() {…}

public void setId(Integer id) {…}

public String getName() {…}

public void setId(String name){…}

@ManyToMany(cascade=CascadeType.REFRESH,mappendBy=”teachers”)

public Set< Student> get Student () {…}

public void setTeacher(Set<Student> student) {…}

}

保存操作

public class ManyToManyTest {

 @Test public void save() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();

    em.persist(new Student(“小张”);

    em.persist(new Teacher(“李勇”);

    em.getTransaction().commit();

    factory.close();

}

//建立学生跟老师的关系

@Test public void buildTS() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();

    Student student = em.find(Student.class,1);

    student.addTeacher(em.getReference(Teacher.class,1));

    em.getTransaction().commit();

    em.close():

    factory.close();

    factory.close();

}

//解除学生跟老师的关系

@Test public void deleteTS() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();

    Student student = em.find(Student.class,1);

    student.removeTeacher(em.getReference(Teacher.class,1));

    em.getTransaction().commit();

    em.close()

    factory.close();

    factory.close();

}

//删除老师

@Test public void deleteTeacher() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();

    Student student = em.find(Student.class,1);

    student.removeTeacher(em.getReference(Teacher.class,1));

    em.remove(teacher);

    em.getTransaction().commit();

    em.close()

    factory.close();

    factory.close();

}

//删除学生

@Test public void deleteStudent() {

    EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();

    Student student = em.getReference(Student.class,1);

        em.remove(student);

    em.getTransaction().commit();

    em.close()

    factory.close();

    factory.close();

}

 

}

8. 联合主键

@Embeddable

public class AirLinePK implements Serializable {

private String startCity;

private String endCity;

 

@Column(length=3)

public String getStartCity() {

    return startCity;

}

public void setStartCity(String startCity) {

    this.startCity = startCity;

}

@Column(length=3)

public String getEndCity() {

    return endCity;

}

public void setEndCity(String endCity) {

    this. endCity = endCity;

}

 

public int hashCode() {

    final int prime = 31;

    int result = 1;

    result = prime * result + ((endCity ==null)?0:endCity.hashCode());

    result = prime * result + ((startCity == null)?0:startCity.hashCode());

    return result;

}

public boolean equals(Object obj) {

    if(this == obj) return true;

    if(obj == null) return false;

    if(getClass() != obj.getClass()) return false;

    final AirLinePK other = (AirLinePK) obj;

    if(endCity == null) {

        if(other.endCity != null) return false;

     }else if(!endCity.equals(other.endCity)) {

         return false;

     }

     if(startCity == null) {

        if(other. startCity != null) return false;

     }else if(!estartCity.equals(other. startCity)) {

         return false;

     }

    return true;

}

}

AirLine实体

@Entity

public class AirLine {

private AirLinePK id;

private String name;

public AirLine() {}

public AirLine(AirLinePK id) {

   this.id = id;

}

public AirLine(String startCity,String endCity,String name) {

    this.id = new AirLinePk(startCity,endCity);

    this.name = name;

}

@EmbeddedId

public AirLinePK getId() {

    return id;

}

public void setId(AirLinePK id) {

    this.id = id;

}

@Column(length=20)

public String getName() {

    return name;

}

public void setName(String name) {

    this.name = name;

}

}

单元测试

@Test public void save() {

EntityManagerFactory factory = Persistence.createEntityManagerFactory(“itcast”);

    EntityManager em = factory.createEntityManager();

    em.getTransaction().begin();

    em.persist(new AirLine(“PEK”,”SHA’,”北京飞上海”));

    em.getTransaction().commit();

    em.close()

    factory.close();

    factory.close();

 

}

 

 

分享到:
评论

相关推荐

    EJB3_JPA开发步骤.pdf

    【EJB3与JPA开发详解】 EJB(Enterprise JavaBeans)是Java平台上的企业级组件模型,用于构建可扩展的、分布式的企业级应用程序。EJB3是EJB规范的一个重要版本,它引入了许多简化开发的新特性,使得EJB更加易用。而...

    jpa开发手册[文].pdf

    jpa开发手册 本文档是关于 Java Persistence API(JPA)的开发手册,旨在为读者提供JPA的理论基础和实践指南。本文档涵盖了JPA的基础知识、JPA的体系架构、Entity Bean的定义和使用、EntityManager的配置和使用、...

    jpa开发手册

    **JPA 开发手册** Java Persistence API (JPA) 是Java平台上的一个规范,用于管理关系数据库中的数据,它提供了一种对象/关系映射(ORM)机制,使得开发者可以使用面向对象的方式来处理数据库操作,而无需直接编写...

    jpa开发手册.doc

    本开发手册旨在深入探讨JPA,帮助开发者理解其核心概念、架构以及如何有效地使用它。 ### 1. 持久化技术的发展 在JPA出现之前,Java开发者通常使用以下几种方法来处理数据库持久化: - **JDBC(Java Database ...

    jpa开发实例和文档

    **JPA开发实例**通常包含以下几个关键部分: 1. **实体(Entities)**:实体是JPA中的核心概念,代表数据库中的表。它们是带有特定注解的Java类,如`@Entity`表示这是一个数据库表,`@Table`定义表名,`@Id`标识...

    03_JPA详解_搭建JPA开发环境和全局事务介绍.zip

    本资料主要针对JPA的使用进行详细讲解,包括如何搭建JPA开发环境以及全局事务的介绍。 **一、JPA开发环境的搭建** 1. **集成环境选择**: JPA可以与多种应用服务器和IDE集成,如Tomcat、Jetty、Eclipse、IntelliJ ...

    详细介绍 jpa 开发文档

    ### 详细介绍 JPA 开发文档 #### 一、发展中的持久化技术 ##### 1.1 JDBC 在早期的企业级应用程序开发中,JDBC (Java Database Connectivity) 是一种广泛使用的数据库连接技术。JDBC 提供了一种标准的方式来访问...

    JPA开发文档--总结

    **JPA 开发文档——全面解析** 1. **发展中的持久化技术** - **JDBC**: JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何连接数据库的应用编程接口,提供了一种标准的方式来访问各种关系...

    实用JPA开发指南----jpa核心技术(关联关系等的配置高级配置)

    EJB3是Enterprise JavaBeans 3.0版本,其中集成了JPA,使得在企业级应用开发中实现数据持久化变得更加便捷。Hibernate则是一个流行的ORM(对象关系映射)框架,它是JPA的一种实现,提供了丰富的功能和高度的灵活性。...

    03_传智播客JPA详解_搭建JPA开发环境和全局事务介绍

    本教程将详细讲解如何搭建JPA开发环境以及如何理解与应用全局事务。 首先,我们需要了解**JPA的基本概念**。JPA提供了一种面向对象的方式来映射关系数据库,使得开发者可以使用Java对象来操作数据库,而无需直接...

    JPA开发所用到的所有JAR包

    描述中提到的"JPA开发所用到的所有JAR包",通常包括以下组件: 1. **JPA API**: 这是JPA的核心库,包含处理实体、查询、事务等所需的接口和类。它定义了JPA规范,并由Java EE或Java SE环境提供。 2. **Persistence...

    JPA 开发中遇到的错误

    以下是从给定文件信息中提炼出的一些常见JPA开发错误及其详细解析: ### 1. org.hibernate.hql.ast.QuerySyntaxException: person is not mapped 此异常表明在HQL查询语句中引用了一个未被持久化类映射的对象或...

    Spring Data JPA API(Spring Data JPA 开发文档).CHM

    Spring Data JPA API。 Spring Data JPA 开发文档。 官网 Spring Data JPA API。

    JPA开发JAR包

    **JPA(Java Persistence API)**是...这个"JPA开发JAR包"可能包含了完整的JPA实现,以及MySQL 5.0驱动,方便开发者在项目中快速集成JPA功能并连接到MySQL数据库。使用这样的JAR包,可以简化开发流程,提高开发效率。

    JPA 开发所要的全部jar包

    在"JPA开发所要的全部jar包"中,你可能找到了以下关键的组件: 1. **Java Persistence API (javax.persistence.jar)**:这是JPA的核心API,提供了所有JPA规范定义的接口和注解,如@Entity、@Table、@Id等。 2. **...

    02_JPA详解_JPA开发环境和思想介绍.zip

    **二、JPA开发环境准备** 1. **JDK**: 首先确保安装了兼容JPA的Java Development Kit(JDK),通常是Java 8或更高版本。 2. **IDE支持**: 选择一个支持JPA的集成开发环境(IDE),如Eclipse、IntelliJ IDEA等,...

    hibernate jpa开发需要的所有包

    本压缩包包含的文件是进行Hibernate JPA开发所需的核心库,让我们逐一解析这些包的作用。 1. **hibernate3.jar**:这是Hibernate的核心库,包含了对持久化对象的管理、事务处理、查询语言(HQL)等核心功能。...

    支持hibernate+jpa开发的jar包

    总之,这个资源包包含了进行Hibernate和JPA开发所需的必备组件,涵盖了ORM、事务管理、测试以及数据库连接等多个方面,为Java开发者提供了全面的支持。通过熟练掌握这些工具和API,开发者能够构建出高效、可靠的...

    使用 Spring Data JPA 简化 JPA 开发 sample code

    这是 《使用 Spring Data JPA 简化 JPA 开发》的sample code。原文在 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-jpa/index.html

Global site tag (gtag.js) - Google Analytics