4.3.1 通过可达性完成持久化

 

如果说一个持久层实现了持久化的可达性的话,那么从一个已经持久化了的对象创建另外一个新的对象时,那个新的对象也会被持久化。在图4.2中展示了这种行为。

在这个例子中,“Computer”是一个持久化对象。“Desktop Pcs”和“Monitors”也是持久化的;可以通过“Computer”来访问到它们。“Electronics”和“Cell Phones”是transient的。注意到这里我们仅仅假设从父访问到子,而没有考虑相反的方向。可达性的持久化是一种递归的算法:所有可以通过持久化实例访问的对象在初始化实例被持久化或者与数据库同步之前持久化。

通过可达性的持久化保证了参照完整性;所有对象都可以通过加载根对象来获得。应用程序可以通过对象之间的关联来进行遍历而不用担心实例的持久化状态。

在最纯粹的可达性的持久化中,数据库应该有一个根来保证所有的持久化都可以被访问。理想状态就是一个对象被删除后就变成transient状态并且通过根无法访问到这个对象。

但是不论是Hibernate还是其他的ORM都没有实现这种机制;它们并不会在SQL数据库中设置什么根对象,也没有持久化垃圾收集器来检测没有被引用的实例。面向对象的数据库可能实现了这些概念,但是在ORM的世界中并没有这样做;扫描所有的表来查找没有被引用的列是不具备可操作性。

因此,可达性的持久化是一个不彻底的解决方案。它会帮助完成将transient对象的持久化而无需调用过多的方法。但是它并不是一个完全的解决数据持久化的方案。这会导致更加复杂的问题。当你删除对象的时候,你不能简单的删除那些可达的实例;其他持久化实例也在引用它们。你甚至不能够简单的删除并没有被内从中对象引用的实例;在内存中的实例仅仅代表一小部分数据库中的数据。让我们来看看Hibernate中更加灵活的传播性持久化模型。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值