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

时间:2013-12-31 21:02:50

标签: orm

我试图理解这个概念,但我在网上搜索的任何解释都太复杂或者假设知识太多。有人可以为我打破这个概念并简单解释一下吗?

2 个答案:

答案 0 :(得分:4)

这意味着数据库被抽象远离您的应用程序,“保存”到数据库的概念不会出现在最高级别。

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

从分离应用程序和数据库层的角度来看,它本质上是一个抽象的圣杯。

答案 1 :(得分:1)

ORM的真正的美丽是提供的透明持久性,它可以让你编写普通的对象并使它们在很少工作的情况下持久化。要了解透明持久性的工作原理,您必须了解以下概念。

第一个是名为持久性上下文的概念。持久性上下文是ORM用于跟踪对象更改以便在以后保留它们的位置。持久化上下文中的每个Object都将具有以下状态之一:

        
  • 瞬态:对象刚刚被实例化,并且与持久性上下文无关。它在持久存储中没有持久表示。
  •     
  • 持久性:该对象与持久性上下文相关联,并在持久存储中具有表示。
  •     
  • 分离:对象不再与持久性上下文相关联(通常是因为持久性上下文已关闭)。
  •     
  • 已删除:该对象与持久性上下文相关联,但计划从持久性存储中删除。

另一个重要概念称为可持续性的持久性。这表明任何与持久对象相关的瞬态对象也将变得持久。

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

让我们把它们放在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();
    }

在线:


    Department dept1 = em.find(Department.class, "department1");

我从持久存储中获取部门 department1 并在线:


    dept1.addEmployee(new Employee("José", 10503f));

只需追加新员工即可。由于 department1 处于持久状态可访问性,员工的瞬态实例(José< / em>)将被保留并附加到部门。

http://www.copypasteisforword.com/notes/hibernate-transparent-persistence中提取。在那里可以找到更多的例子。