我正在努力理解这个概念,但我在网上搜索的任何解释都太复杂或假设知识太多。有人能为我分解这个概念并简单地解释一下吗?
这意味着数据库被从应用程序中抽象出来,以至于"保存"到数据库的概念不会在最高级别上显示出来。
换句话说,您的应用程序将在业务对象上设置数据,并在下面的某个较低层中设置数据,这些数据将被自动保存。透明地。
从本质上讲,它是抽象的圣杯,将应用程序与数据库层分离。
ORM的真正的美是它提供的透明持久性,它可以让您编写简单的对象,并使它们只需很少的工作就可以持久化。要理解透明持久性是如何工作的,您必须理解以下概念。
第一个是一个名为PersistenceContext的概念。持久性上下文是ORM用来跟踪对象更改的地方,以便在以后将其持久化。持久性上下文中的每个对象都将具有以下状态之一:
- new或transient:对象刚刚实例化,与持久性上下文无关。它在持久存储中没有持久表示
- persistent:对象与持久性上下文相关联,并在持久性存储中具有表示形式
- 分离:对象不再与持久性上下文关联(通常是因为持久性上下文已关闭)
- 已删除:对象与持久性上下文相关联,但计划将其从持久性存储中删除
另一个重要的概念被称为通过可达性的持久性。它表示任何与持久对象相关的瞬态对象也将变为持久对象。
这两个概念的实现使得所谓的透明持久性成为可能。
让我们把这些放在java/jpa代码中:
EntityManager em=//获取EntityManger实例EntityTransaction tx=null;尝试{tx=em.getTransaction();tx.begin();Department dept1=em.find(Department.class,"department1");dept1.addEmployee(新员工("José",10503f));tx.commit();}catch(异常e){if(tx!=null){tx.rollback();}抛出新的RuntimeException(e);}最后{em.close();}
在线:
Department dept1=em.find(Department.class,"department1")
我正在从持久存储中获取部门部门1并联机:
dept1.addEmployee(新员工("José",10503f))
只需向其附加一名新员工。由于department1处于持久状态,通过可达性员工的瞬态实例(José)将持久化并附加到部门。