JPA

JPA: Java Persistence API

是从EJB3.0才有的新技术,开始于Java EE 5.0 它可以和EJB一起使用, 也可以独立使用, 比如在Web层,或者Java SE中使用。

JPA是一个接口.

不同的服务器提供不同的实现, JBoss用Hibernate, Websphere用OpenJPA

JPA包含三大功能

1.ORM映射元数据

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

简单来说就是,Class与数据库表一一映射。

2.JPA 的API

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

EntityManager提供增删改查的方法,用这些就不用写SQL语句了。

persist()

merge()

remove()

refresh()

find()

getReference() .......

3. 查询语言

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

JPQL, 一种面向对象的查询语言,与Hibernate的HQL类似。 最后会转换成SQL


JPA的一大好处在于可以分离于容器运行, 就是不用EJB容器也能用。


Cascade是可以嵌套的, 就是说如果Object A对B是Cascade.REMOVE, B对C是Cascade.REMOVE, 那么在删除A的时候会删除对应的B, 也会删除对应的C


JPA中最重要的概念是EntityManager称为实体管理器,它由EntityManagerFactory所创建。EntityManagerFactory,作为EntityManager的工厂,包含有当前O-R映射的元数据信息,每个EntityManagerFactory,可称为一个持久化单元(PersistenceUnit),每个持久化单元可认为是一个数据源的映射(所谓数据源,可理解为一个数据库,我们可以在应用服务器中配置多个数据源,同时使用不同的PersistenceUnit来映射这些数据源,从而能够很方便的实现跨越多个数据库之间的事务操作!)PersistenceContext,称为持久化上下文,它一般包含有当前事务范围内的,被管理的实体对象(Entity)的数据。每个EntityManager,都会跟一个PersistenceContext相关联。PersistenceContext中存储的是实体对象的数据,而关系数据库中存储的是记录,EntityManager正是维护这种OR映射的中间者,它可以把数据从数据库中加载到PersistenceContext中,也可以把数据从PersistenceContext中持久化到数据库,EntityManager通过Persist、merge、remove、refresh、flush等操作来操纵PersistenceContext与数据库数据之间的同步!


在Java EE环境下,一个JTA事务通常会横跨多个组件的调用(比如多个EJB组件的方法调用)。这些组件需要能够在单个事务范围内访问到同样的Persistence Context。为了满足这种情况的需要,当EntityManager被注入或通过jndi被查询的时候,它的Persistence Context将会在当前事务范围内自动传播,引用到同一个Persistence unit的EntityManager将使用同样的Persistence Context。这可以避免在不同的组件之间传递EntityManager引用。

 

通过容器来传递PersistenceContext,而不是应用程序自己来传递EntityManager。这种方式(由容器管理着PersistenceContext,并负责传递到不同的EntityManager)称为容器管理的实体管理器(Container-Managed EntityManager),它的生命周期由容器负责管理。

 

有一种不常见的情况是,应用程序自身需要独立访问Persistence Context。即每次创建一个EntityManager都会迫使创建一个新的Persistence Context。这些Persistence Context即使在同一个事务范围内也不会跟其它EntityManager共享!这个创建过程可以由EntityManagerFactory的createEntityManager方法来创建。这被称为应用管理的实体管理器(application-managed entity manager)。


底层事务控制

EntityManager的底层可以使用JTA或RESOURCE_LOCAL类型的事务控制策略。JTA一般在容器环境中使用,而RESOURCE_LOCAL一般在J2SE的环境下使用。

比如,在J2SE的环境下,由应用程序自身来创建EntityManagerFactory,并由EntityManagerFactory创建EntityManager,通过EntityManager.getTransaction.begin()方法来开启事务,commit()方法提交事务等等,这种方式就是RESOURCE_LOCAL的基本使用方法。

最常用的就是在容器环境下使用。也就是使用JTA类型的EntityManager,这样,EntityManager的调用都是在一个外部的JTA事务环境下进行的。

Container-Managed EntityManager必须是JTA类型的EntityManager,而Application-Managed EntityManager则既可以是JTA类型的EntityManager,也可以是RESOURCE_LOCAL类型的EntityManager。

配置示例: in persistence.xml

<persistence-unit name="test" transaction-type="JTA">


Container-Managed Persistence ContextCode 示例:

@PersistenceContext(unitName="test")

    private EntityManager em;


persistence context的生命周期对应用程序来说,总是被自动、透明的管理着的。也就是对应用程序本身来说,它对persitence context的创建、销毁一无所知,完全自动和透明。Persistence context随着JTA事务而传播。


Application-Managed Persistence Context

即当我们自己创建EntityManager的时候,我们通过entityManager.close() / isOpen()方法来管理entityManager及其对应的persistence context.

实体对象的生命周期

几种类型:New,managed,detached,removed

 

New – 即未有id值,尚未跟persistence context建立关联的对象

Managed – 有id值,已跟persistence context建立了关联

Detached – 有id值,但没有(或不再)跟persistence context建立关联

Removed – 有id值,而且跟persistence context尚有关联,但已准备好要从数据库中把它删除。

EntityManager的接口方法

 

添加:调用persist方法

* 将把一个对象持久化,如果对象的ID非空,则在调用persist方法时将抛出异常,无法持久化

 

删除:remove方法

不能直接new一个对象,然后给它的id赋值,然后删除。要删除一个对象,这个对象必须是处于持久化状态。

 

更新:merge方法

 

Find – 查找某个对象,如果查不到该对象,将返回null,相当于get

 

getReference – 查找某个对象,如果查找不到该对象,将抛出异常,相当于load

 

flush – 将实体对象由persistence context同步到底层的数据库

l  FlushMode

n  Auto – 即在同一个事务中,在查询发生前,将自动把数据从PersistenceContext持久化到数据库中。

n  Commit – 只在提交的时候,把数据从PersistenceContext中持久化到数据库中。如果设置FlushMode为commit,那么在同一个事务中,在查询之前,如果有更新的数据,这些数据是否会影响到查询的结果,这种情况,EJB3未作说明。

 

Lock – 锁定某个实体对象

实际上就是定义事务的隔离级别。总共有两种形式:READ和WRITE,表示:

不管是READ还是WRITE,都应该能够避免脏读(读到另外一个事务未提交的数据)和不可重复读(同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。)

而对于WRITE来说,还应该能够强迫版本号的增加(对那些标识了版本的对象而言)。因此,其它事务无法对其做任何更改操作!

 

Refresh – 将数据从数据库中加载到Persistenc Context。

 

Clear – 清除Persistence Context中缓存的实体对象数据

 

Contains – 测试当前Persistence Context中是否包含某实体对象

如何注入EntityManager对象?

1、首先要确保persistence.xml中已定义了相应的persistence-unit,比如:

<?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_1_0.xsd" version="1.0">

    <persistence-unit name="test" transaction-type="JTA">

        <jta-data-source>java:/MySqlDS</jta-data-source>

        <properties>

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

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

          <property name="hibernate.show_sql" value="true"/>

        </properties>

    </persistence-unit>

</persistence>

2、在session bean中(如果用EJB),直接定义EntityManager,并使用@PersistenceContext注解注入即可:

      如果用spring, 则是service

@Stateless(name="userManager")

public class UserManagerImpl implements UserManager {

 

    /**

     * 如果只定义了一个Persistence Unit,则无需指定unitName,但一旦定义了

     * 多个,则必须指定unitName

     */

    @PersistenceContext(unitName="test")

    private EntityManager em;

如何由应用程序来管理EntityManager?

我们一般情况下,都不需要由应用程序自身来管理EntityManager,最好就是使用容器管理的EntityManager对象。但某些特殊情况下,我们可能想要由应用程序本身来管理它,那么,可以采取如下方法来办到这一点。

1、注入EntityManagerFactory对象

/**

     * 也可以注入EntityManagerFactory,手工管理PersistenceContext

     */

    @PersistenceUnit(unitName="test")

    private EntityManagerFactory factory;

2、在程序中,用factory来创建和管理EntityManager对象

EntityManager em = factory.createEntityManager();

      

       Student student = new Student();

       student.setName("张三");

       em.persist(student);

      

       em.close();

更详细请参阅: http://www.cnblogs.com/-10086/archive/2012/09/16/2687550.html





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
,发送类别,概率,以及物体在相机坐标系下的xyz.zip目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值