在ORM的上下文中,什么是透明持久性?

在ORM的上下文中,什么是透明持久性?,orm,Orm,我试图理解这个概念,但我在网上搜索的任何解释都太复杂或假设了太多的知识。有人能给我解释一下这个概念吗 这意味着数据库被从应用程序中抽象出来,以至于“保存”到数据库的概念不会出现在最高级别上 换句话说,您的应用程序将在业务对象上设置数据,并在较低层的某个深处设置数据,这些数据将自动保存。透明的 从本质上讲,它是一个抽象的圣杯,将应用程序与数据库层分离。ORM真正的美在于它提供了透明的持久性,它可以让您编写简单的对象,并使它们持久化,而无需太多工作。要理解透明持久性是如何工作的,您必须理解以下概念

我试图理解这个概念,但我在网上搜索的任何解释都太复杂或假设了太多的知识。有人能给我解释一下这个概念吗

这意味着数据库被从应用程序中抽象出来,以至于“保存”到数据库的概念不会出现在最高级别上

换句话说,您的应用程序将在业务对象上设置数据,并在较低层的某个深处设置数据,这些数据将自动保存。透明的


从本质上讲,它是一个抽象的圣杯,将应用程序与数据库层分离。

ORM真正的美在于它提供了透明的持久性,它可以让您编写简单的对象,并使它们持久化,而无需太多工作。要理解透明持久性是如何工作的,您必须理解以下概念

第一个是称为持久性上下文的概念。持久化上下文是ORM用来跟踪对象更改的地方,以便在以后的时间点持久化它们。持久性上下文中的每个对象将具有以下状态之一:

  • newtransient:对象刚刚实例化,未与持久性上下文关联。它在持久性存储中没有持久性表示
  • 持久化:对象与持久化上下文关联,并在持久化存储中具有表示形式
  • 分离:对象不再与持久性上下文关联(通常是因为持久性上下文已关闭)
  • 已删除:对象与持久性上下文关联,但已计划将其从持久性存储中删除
另一个重要的概念称为可达性持久性。这表示任何与持久对象相关的临时对象也将成为持久对象

这两个概念的实现使得所谓的透明持久化成为可能

让我们把这些放在java/jpa代码中:

EntityManager em = //obtain the EntityManger instance EntityTransaction tx = null; try { tx = em.getTransaction(); tx.begin(); Department dept1 = em.find(Department.class, "department1"); dept1.addEmployee(new Employee("José", 10503f)); tx.commit(); } catch (Exception e) { if (tx != null) { tx.rollback(); } throw new RuntimeException(e); } finally { em.close(); } EntityManager em=//获取EntityManger实例 EntityTransaction tx=null; 试一试{ tx=em.getTransaction(); tx.begin(); Department dept1=em.find(Department.class,“department1”); 部门1.增聘员工(新员工(“José”,10503f)); tx.commit(); }捕获(例外e){ 如果(tx!=null){ tx.回滚(); } 抛出新的运行时异常(e); }最后{ em.close(); } 在线:

Department dept1 = em.find(Department.class, "department1"); Department dept1=em.find(Department.class,“department1”); 我正在从永久存储和联机获取部门1:

dept1.addEmployee(new Employee("José", 10503f)); 部门1.增聘员工(新员工(“José”,10503f)); 只需添加一名新员工即可。由于部门1处于持续状态,因此通过可达性,员工(José)的瞬态实例将被持续并附加到部门


摘录自:。更多的例子可以在这里找到。

Ok。为了确保我明白这一点。假设我有一个带有属性
NumberPlate
的对象
car
,该对象通过ORM映射到数据库中的一个表。如果我做了一些类似于
car.NumberPlate=“22okyu7”
的事情,那么您所说的透明持久性是这样一个事实:当我设置该属性时,数据库记录会自动更新,而无需我做任何进一步的操作?