Hibernate chapter 3.Persistence Contexts

来源:互联网 发布:淘宝crm客户管理系统 编辑:程序博客网 时间:2024/04/28 13:41

内容列表

org.hibernate.Session API和javax.persistence.EntityManager API代表一个处理持续化数据的上下文。即persistence context。持续化数据有一个状态与持续化上下文和底层数据库关联。


Entity states(实体状态)

  •         new ,或者persistent - 实体已经被实例化并且还没有与一个持续化上下文关联。其在数据库中没有持续化的表示并且没有指定标示。
  •         managed,或者persistent - 实体关联了标示并且与一个持续化上下文关联
  •         detached - 虽然实体有一个关联的标示,但不再关联一个持续化上下文。(通常因为关闭了持续化上下文或者从上下文中没收了实例)
  •         removed - 实体有一个关联的标示并且与一个持续化上下文关联,然而其计划从数据库中移除

在Hibernate的本地API中,持续化上下文定义在org.hibernate.Session中。在JAP中,持续化上下文定义在javax.persistence.EntityManager。这两个API中有大量方法处理不同状态之间的移动实体。


3.1 Making entities persistent (实体持久化)

一旦创建了一个新的实例,其为new状态。你可以通过org.hibernate.Session或者javax.persistence.EntityManager关联这些实例从而持久化。

Example 3.1 Example of making an entity persistent

DomesticCat fritz = new DomesticCat();fritz.setColor( Color.GINGER );fritz.setSex( 'M' );fritz.setName( "Fritz" );session.save( fritz );


DomesticCat fritz = new DomesticCat();fritz.setColor( Color.GINGER );fritz.setSex( 'M' );fritz.setName( "Fritz" );entityManager.persist( fritz );

org.hibernate.session中也有一个persist方法,其与javax.persistence.EntityManager中的persist方法有相同的语义。两个包中的persist方法实现了委托机制。


如果上述的实体有一个生成的标示,当调用save或者persist方法时,标示就与实例关联。如果标示没有自动创建,应用程序指定的key值得在save或者persist方法调用前赋值给这个实例。


3.2 Deleting  entities(删除实例)

实体也可以别删除

Example 3.2. Example of deleting an entity

             session.delete( fritz );

             entityManager.remove( fritz );


Hibernate可以删除detached状态,这点很重要值得注意。然而在JPA中,不允许这样做。区别是传给org.hibernate.Session的delete方法的实例状态可以是detached或者managed,而传给javax.persistence.EntityManager必须是managed状态


3.3 Obtain an entity reference without initializing its data(获取不需要初始化数据的实体引用)

有时候涉及到延迟加载,获取一个实体引用而不必加载其数据是很有用的。最大的通用情况是需要在一个实体和另一个已经存在的实体之间创建一个关联。

Example 3.3. Example of obtaining an entity reference without initializing its data

      Book book = new Book();
      book.setAuthor( session.byId( Author.class ).getReference( authorId ) );

     

     Book book = new Book();
     book.setAuthor( entityManager.getReference( Author.class, authorId ) );



0 0
原创粉丝点击