持久化实例拥有数据库标识,就像在第三章3.4中讨论的那样。这意味着持久化实例都拥有一个主键作为它的数据库标识符。
持久化实例可能是那些通过程序初始化然后通过调用持久化管理器的save()方法来完成的。然后持久化对象就和持久化管理器产生了关联。持久化对象也可以通过和其他持久化管理器关联的持久化对象引用而来。另外,持久化对象也可以通过查询数据库得来。也就是说,持久化实例通常都和Session产生关联并且是事务性的。
持久化实例参与到事务当中——它们的状态在事务的结尾和数据库保持同步。当一个事务提交的时候,保存在内存中的状态通过SQL被提交到数据库中。这个过程可能发生几次。举例来说,在执行查询之前,Hibernate会和数据库进行同步。这个过程保证查询能够返回最新的数据。
当一个持久化拥有了主键但还没有插入到数据库被称为new。也就是说在同步发生之前持久化实例一直会保持这种new的状态。
当然,在事务的结尾你并没有更新所有的持久化对象。ORM必须拥有能够检测这些持久化对象是否被修改的策略。
我们把这种检查称之为脏数据检查。同样的,这些状态对于应用程序来说是透明的。Hibernate会尽可能晚的把状态同步到数据库中,而这些对于应用程序来说都是透明的。
Hibernate能够精确的检测到哪个属性被修改了,因此在UPDATE中可以精确的定位到哪个列需要被更新。这对于某些数据库来说,可能会带来性能上的提升。然而,这并不是每次都那么有效率,理论上,在某些环境中这可能会降低性能。因此,在默认情况下,Hibernate会在UPDATE中包含所有的列。如果你只想更新那些被修改的列,你可以通过修改配置dynamic-update=”true”来实现。在一部分中,我们会更详细讨论Hibernate事务的语义和同步过程。
最后,通过调用持久化管理器的 delete()方法来完成持久化实例到transient的转换,这样做的结果就是删除了表中对应的数据行。