在ORM的上下文中,什么是透明持久性?
在ORM的上下文中,什么是透明持久性?,orm,Orm,我试图理解这个概念,但我在网上搜索的任何解释都太复杂或假设了太多的知识。有人能给我解释一下这个概念吗 这意味着数据库被从应用程序中抽象出来,以至于“保存”到数据库的概念不会出现在最高级别上
换句话说,您的应用程序将在业务对象上设置数据,并在较低层的某个深处设置数据,这些数据将自动保存。透明的
从本质上讲,它是一个抽象的圣杯,将应用程序与数据库层分离。ORM真正的美在于它提供了透明的持久性,它可以让您编写简单的对象,并使它们持久化,而无需太多工作。要理解透明持久性是如何工作的,您必须理解以下概念
我试图理解这个概念,但我在网上搜索的任何解释都太复杂或假设了太多的知识。有人能给我解释一下这个概念吗 这意味着数据库被从应用程序中抽象出来,以至于“保存”到数据库的概念不会出现在最高级别上
换句话说,您的应用程序将在业务对象上设置数据,并在较低层的某个深处设置数据,这些数据将自动保存。透明的
从本质上讲,它是一个抽象的圣杯,将应用程序与数据库层分离。ORM真正的美在于它提供了透明的持久性,它可以让您编写简单的对象,并使它们持久化,而无需太多工作。要理解透明持久性是如何工作的,您必须理解以下概念
第一个是称为持久性上下文的概念。持久化上下文是ORM用来跟踪对象更改的地方,以便在以后的时间点持久化它们。持久性上下文中的每个对象将具有以下状态之一:
- new或transient:对象刚刚实例化,未与持久性上下文关联。它在持久性存储中没有持久性表示
- 持久化:对象与持久化上下文关联,并在持久化存储中具有表示形式
- 分离:对象不再与持久性上下文关联(通常是因为持久性上下文已关闭)
- 已删除:对象与持久性上下文关联,但已计划将其从持久性存储中删除
另一个重要的概念称为可达性持久性。这表示任何与持久对象相关的临时对象也将成为持久对象
这两个概念的实现使得所谓的透明持久化成为可能
让我们把这些放在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”
的事情,那么您所说的透明持久性是这样一个事实:当我设置该属性时,数据库记录会自动更新,而无需我做任何进一步的操作?