`

JPA学习笔记

 
阅读更多

 

所有的注解都是定义在getter方法的类名上的。
最好不要把类名或者字段名定义为数据库中的关键字相同!!!!!
JPA的配置文件persistence.xml是在META-INF文件夹下的

EntityManager,在对数据库做查询操作的时候,不需要开始事务,也就是说:

EntityManagerFactory factory=Persistence.createEntityManagerFactory();
EntityManager em=factory.createEntityManager();
em.getTransaction.begin();//开始事务
Person person=em.find(Person.class,1);
System.out.println(person.getName());
em.getTransaction.commit();
em.close();
factory.close();
上面代码中的
em.getTransaction.begin();//开始事务
em.getTransaction.commit();
这两行代码是不需要的(在查询数据库的时候)
只有在修改的时候,需要事务。(增、删、改操作)

获取数据的em.find(Person.class,1);相当于hibernate中的get(Person.class,1);方法,如果没有数据,会返回null值。

JPA还有一个方法em.getReference(Person.class,1);
相当于hibernate中的load()方法,执行em.getReference(Person.class,1);的时候并不会去数据库中拿数据,
而是在person.getName();的时候才会去数据库中查询,name的值。如果没有相应数据,会报异常。
EntityNotFoundException

实体的三个状态:

new :新创建的对象
managered 托管(非脱管,以前老记为脱管)
事务之内,是托管态。在托管态的对象是和数据库关联的。
EntityManagerFactory factory=Persistence.createEntityManagerFactory();
EntityManager em=factory.createEntityManager();
em.getTransaction.begin();//开始事务
Person person=em.find(Person.class,1);//托管
System.out.println(person.getName());
em.getTransaction.commit();
em.close();
factory.close();

游离(脱管)状态
EntityManagerFactory factory=Persistence.createEntityManagerFactory();
EntityManager em=factory.createEntityManager();
em.getTransaction.begin();//开始事务
Person person=em.find(Person.class,1);
em.clear();//清空缓存
System.out.println(person.getName());//这时候的person是游离态。也就是没有和数据库联系,对它修改不会同步到数据库
em.getTransaction.commit();
em.close();
factory.close();
有一个方法可以把游离态的实体对象,和数据库关联起来(前提是必须是游离态的对象)
EntityManagerFactory factory=Persistence.createEntityManagerFactory();
EntityManager em=factory.createEntityManager();
em.getTransaction.begin();//开始事务
Person person=em.find(Person.class,1);
em.clear();//清空缓存,这个时候,person是游离态的。
person.setName("tom");
em.merge(person);
em.getTransaction.commit();
em.close();
factory.close();
这里的merge会把游离态的person联系到数据库,所做修改会先保存到session中。在commit之后
会保存到数据库中。merge的目的就是把游离态的数据和数据库联系起来。


删除状态
EntityManagerFactory factory=Persistence.createEntityManagerFactory();
EntityManager em=factory.createEntityManager();
em.getTransaction.begin();//开始事务
Person person=em.find(Person.class,1);
em.remove(person);
em.getTransaction.commit();
em.close();
factory.close();


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

oneToMany是在一端配置的
@oneToMany(cascade=(CascadeType.PERSIST,CascadeType.REFRESH,CascadeType.REMOVE))

级联的几种方式:ALL,MERGE,PERSIST,REFRESH,REMOVE
PERSIST:级联持久化(或者可以理解为级联保存??),one端数据持久化的时候,many端数据也会持久化
MERGE:级联更新(可以认识是修改数据的时候级联?也就是做update的时候?)
REFRESH:级联刷新:也就是如果其他用户修改了一条数据的话,我再用这个数据之前要重新获取一次,以防止要操作的数据是错误的。感觉像是防止脏读的。
REMOVE:就是级联删除啦,如果one端数据被删除,那么many端与与之对应的数据也会被删除。

EntityManagerFactory factory=Persistence.createEntityManagerFactory();
EntityManager em=factory.createEntityManager();
em.getTransaction.begin();//开始事务
Person person=em.find(Person.class,1);
em.refreash(person);//重新从数据库中获取一次数据。可能在你操作的过程中别人对它进行了修改操作。
em.getTransaction.commit();
em.close();
factory.close();
JPA延迟加载(相当于hibernate中的lazy=true,lazy=false)
@oneToMany(cascade=(CascadeType.REFREASH),fetch=FetchType.EAGER)
fetchType有两种:EAGER,LAZY
EAGER就是立即加载。LAZY是延迟加载
如果要使用LAZY的话,也就是延迟加载的话,那么再获取one端数据的时候,不会去查询many端的数据。
而且,要从one端对象获取many端数据的时候是再次从数据库中查询得到的。这个时候必须保证EntityManager是打开状态。
只要是级联获取many端数据的时候,默认是LAZY。也就是说@oneToMany,@ManyToMany默认都是延迟加载的。

关系维护的控制权(相当于hibernate中的inverse)
@oneToMany(fetch=FetchType.EAGER,mapperBy="order")//这里的order要看many端类里定义的属性名是什么,比如:

One端类为Order.java
many端为OrderItem.java,在OrderItem.java中定义了一个private Order order;
那在One端中的@oneToMany()中就要定义这样一个mapperBy="order",表示他们两个的外键关系由many端的order来维护。
好像是mapperBy只定义在关系被维护端。就是有外键的一端来维护外键关系。
@ManyToOne(),默认是立即加载。

optional
@ManyToOne(optional=true)
public Order getOrder()
{
    return order;
}

@ManyToMany()中还有一个属性optional,它有两个值true,false
true代表many端的Order属性可以为Null,false表示不能为null.

@JoinColumn(name="order_id")
public Order getOrder()上还要定义一个外键关系字段是哪个。

@ManyToMany双向关联关系
例子:teachers,students,
老师做关系的被维护段,学生做关系的维护段。
那么在老师和学生的关系没解除的情况下,不可以直接通过EntityManager的remove方法删除teacher对象。
必须在学生端先解除关系,才可以对老师进行remove.
删除学生的时候

联合主键
例如:飞机的:startCity,endCity.这两个属性做为联合主键。
要求:
1. 必须实现Serializable接口
2. 必须有一个无参数的构造方法
3. 重写hashCode()和equals(),重写这两个方法必须要联合主键的属性endCity,startCity.
(直接右键,override就可以了。)
例子:
联合主键类:
@Embeddable   //这个注解表明要使用AirLinePK中的两个字段做其他实体类的联合主键。
AirLinePK.java
两个属性,private String startCity,endCity,然后是setter/getter方法
实现Serializable接口,重写hashCode(),equals()方法。有一个无参的构造方法。



Airline.java
private AirLinePK id;
private String name;
//getter/setter方法
@EmbeddedId  // 表明它是做为联合主键的
public AirLinePK getId()
{
    return id;
}


<div
0
0
分享到:
评论

相关推荐

    传智播客JPA学习笔记.pdf

    **Java Persistence API (JPA)** 是Java平台上的...以上就是JPA学习笔记中的关键知识点,涵盖了JPA的基本概念、环境配置、对象关系映射、查询语言、事务管理、关联关系等多个方面,对于理解和应用JPA有重要的指导作用。

    传智播客——JPA学习笔记

    传智播客——JPA学习笔记 网络上有一份pdf格式的《JPA学习笔记》,但是内容排版有点乱,而且有缺失的部分,小弟从原来的blog处拷贝出来,并加以排版,制作成了chm格式的,大家应该知道chm格式比较适合作为参考资料或...

    JPA学习笔记-EJB-01JPA初体验

    ### JPA学习笔记-EJB-01 JPA初体验 #### 一、前言与背景 JPA(Java Persistence API)是一种为Java平台定义的对象-关系映射标准,旨在简化对象到关系数据库表的持久化过程。本文档是关于JPA的学习笔记,作者通过...

    JPA学习笔记-EJB-02JPA属性注解

    ### JPA学习笔记-EJB-02JPA属性注解 #### 一、引言 在上一篇文章中,我们简要介绍了Java Persistence API (JPA)的基础知识,包括它的基本部署和操作流程,从而让我们对JPA有了初步的认识。本文将继续深入探讨JPA的...

    Spring-data-jpa 学习笔记.docx

    ### Spring-data-jpa 学习笔记 #### 一、spring-data-jpa的简单介绍 Spring Data JPA 是 Spring Data 的一部分,它简化了基于 Java Persistence API (JPA) 的数据访问层开发工作。Spring Data 旨在减少数据访问层...

    spring-data-JPA学习笔记

    在"spring-data-JPA学习笔记"中,我们主要关注的是如何使用JPA进行CRUD操作以及一些常用的查询方法。 首先,Spring Data JPA 提供了一种基于方法名的自动查询映射机制。例如,`findByUsernameAndPassword(String ...

    JPA学习笔记-EJB-04JPA关联映射总结

    本篇笔记主要聚焦于JPA的关联映射,这是JPA中一个重要的概念,用于定义实体之间的关系。 关联映射允许我们将数据库中的表关系映射到Java对象的关联上。在Hibernate中,这些关系通常通过XML配置文件来定义,而在JPA...

    jpa学习笔记 介绍了jpa中state的概念和应用

    本篇学习笔记主要探讨了JPA中实体的状态及其转换,包括New、Managed、Detached和Removed四种状态。 首先,实体(Entity)是JPA中的核心概念,它代表数据库中的一个记录。实体的身份(Identity Fields)用于唯一标识...

    JPA学习笔记-EJB-03JPA主键生成策略总结

    ### JPA主键生成策略详解 #### 一、概述 持久化对象的主键生成机制在JPA(Java Persistence API)中占据着重要的位置。它不仅关乎数据的唯一标识符如何确定,还与数据的存储效率及应用逻辑紧密相关。JPA通过`@...

    JPA学习笔记-EJB-05JPA实体对象状态和实体对象的高级操作

    ### JPA实体对象状态 #### 一、实体对象的状态分类 在Java Persistence API (JPA) 中,实体对象的状态管理是实现数据持久化的基础之一。根据实体对象与实体管理器(EntityManager)之间的交互关系,实体对象可以...

    jpa 全面学习资料

    JPA学习笔记** 学习笔记可能涉及更深入的话题,如: - **懒加载(Lazy Loading)与急加载(Eager Loading)**: 管理关联对象的加载时机。 - **继承映射(Inheritance Mapping)**: 包括单表继承、联合继承和表格...

Global site tag (gtag.js) - Google Analytics